python - Tkinter 滚动条——Python 3
问题描述
我最近一直在开发一个测验应用程序,现在我开始制作 GUI。我想这样做,以便我可以有一个用于水平滚动的滚动条,而如果 GUI 长度大于某个长度,则会显示垂直滚动条。唉,我只是 Tkinter 初学者,无法弄清楚滚动条。请帮帮我。这是图形用户界面的代码:
def run(self):
self.root1 = tk.Tk()
self.root1.protocol("WM_DELETE_WINDOW", self.cont)
self.root1.resizable(False, False)
self.root1.title(TITLE)
QAS_SEQUENCED = qasSequenced
ANSWERS = list(QAS_SEQUENCED.values())
QUESTIONS = list(QAS_SEQUENCED.keys())
print(QUESTIONS)
print(ANSWERS)
global ANSWER_FIELDS
ANSWER_FIELDS = []
ANSWER_FIELDS.clear()
self.REPLIES_AA = []
qColumnIndex = 1 #Current Column (Qs relative)
qColumnIndex_ALIGN = 1
numColumns = int(len(QUESTIONS)/10) #Num columns (Qs total)
ROW = 0
QUESTION = ""
for i in range(0, len(QUESTIONS)):
QUESTION_TMP = QUESTIONS[i]
QUESTION = ""
QUESTION_NEWLINE_INDEX = int(len(QUESTION_TMP)/40)
QUESTION_NEWLINE_INDEX_USE = 1
for ii in range(0, len(QUESTION_TMP)):
QUESTION_TMP = str(QUESTION_TMP)
if (ii+1) >= 40*QUESTION_NEWLINE_INDEX_USE or QUESTION_TMP[ii] == "`":
QUESTION += ("\n")
if not QUESTION_TMP[ii] == "`":
QUESTION += str(QUESTION_TMP[ii])
QUESTION_NEWLINE_INDEX_USE += 1
else:
QUESTION += str(QUESTION_TMP[ii])
QUESTION = str(QUESTION)
ANSWERS[i] = str(ANSWERS[i])
print('Setting up question ' + str(i+1))
print('Question: ' + QUESTION + ' Answer: ' + ANSWERS[i] + "\n")
if ROW > 10:
qColumnIndex += 1
qColumnIndex_ALIGN += 2
ROW = 0
QUESTION_TMP = tk.Label(self.root1)
QUESTION_TMP.config(text=QUESTION)
QUESTION_TMP.grid(row=ROW,column=(qColumnIndex_ALIGN-1))
ANSWER_TEMP_ASF = tk.Entry(self.root1)
ANSWER_TEMP_ASF.grid(row=ROW,column=(qColumnIndex_ALIGN))
ANSWER_FIELDS.append(ANSWER_TEMP_ASF)
ROW += 1
if len(QUESTIONS) <= 10:
self.submitButton = tk.Button(self.root1,text='SUBMIT ANSWERS',command=self.submitClick)
self.submitButton.grid(row=(len(QUESTIONS)+1),column=1)
else:
self.submitButton = tk.Button(self.root1, text='SUBMIT ANSWERS', command=self.submitClick)
self.submitButton.grid(row=(len(QUESTIONS)+1),column=1)
self.root1.mainloop()
解决方案
阅读在 Tkinter 中为一组小部件添加滚动条-@stovfl
我阅读了上述文章并对我的代码进行了一些简单的更改。他们如下:
def onFrameConfigure(self, canvas):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def run(self):
self.root1 = tk.Tk()
self.root1.protocol("WM_DELETE_WINDOW", self.cont)
self.root1.resizable(True, True)
self.root1.title(TITLE)
self.canvas = tk.Canvas(self.root1, borderwidth=0)
self.frame = tk.Frame(self.canvas)
self.vsb = tk.Scrollbar(self.root1, orient="vertical", command=self.canvas.yview)
self.xsb = tk.Scrollbar(self.root1, orient="horizontal",command=self.canvas.xview)
self.canvas.configure(yscrollcommand=self.vsb.set,xscrollcommand=self.xsb.set)
self.vsb.pack(side="right", fill="y")
self.xsb.pack(side="bottom",fill="x")
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((6,6),window=self.frame, anchor="nw")
self.frame.bind("<Configure>", lambda event, canvas=self.canvas: self.onFrameConfigure(self.canvas))
QAS_SEQUENCED = qasSequenced
ANSWERS = list(QAS_SEQUENCED.values())
QUESTIONS = list(QAS_SEQUENCED.keys())
print('SETUP Frame')
print(QUESTIONS)
print(ANSWERS)
global ANSWER_FIELDS
ANSWER_FIELDS = []
ANSWER_FIELDS.clear()
self.REPLIES_AA = []
print('Set self.REPLIES_AA')
qColumnIndex = 1 #Current Column (Qs relative)
qColumnIndex_ALIGN = 1
numColumns = int(len(QUESTIONS)/10) #Num columns (Qs total)
ROW = 0
QUESTION = ""
for i in range(0, len(QUESTIONS)):
QUESTION_TMP = QUESTIONS[i]
QUESTION = ""
QUESTION_NEWLINE_INDEX = int(len(QUESTION_TMP)/40)
QUESTION_NEWLINE_INDEX_USE = 1
for ii in range(0, len(QUESTION_TMP)):
QUESTION_TMP = str(QUESTION_TMP)
if (ii+1) >= 40*QUESTION_NEWLINE_INDEX_USE or QUESTION_TMP[ii] == "`":
QUESTION += ("\n")
if not QUESTION_TMP[ii] == "`":
QUESTION += str(QUESTION_TMP[ii])
QUESTION_NEWLINE_INDEX_USE += 1
else:
QUESTION += str(QUESTION_TMP[ii])
QUESTION = str(QUESTION)
ANSWERS[i] = str(ANSWERS[i])
print('Setting up question ' + str(i+1))
print('Question: ' + QUESTION + ' Answer: ' + ANSWERS[i] + "\n")
if ROW > 10:
qColumnIndex += 1
qColumnIndex_ALIGN += 2
ROW = 0
QUESTION_TMP = tk.Label(self.frame)
QUESTION_TMP.config(text=QUESTION)
QUESTION_TMP.grid(row=ROW,column=(qColumnIndex_ALIGN-1))
ANSWER_TEMP_ASF = tk.Entry(self.frame)
ANSWER_TEMP_ASF.grid(row=ROW,column=(qColumnIndex_ALIGN))
ANSWER_FIELDS.append(ANSWER_TEMP_ASF)
ROW += 1
if len(QUESTIONS) <= 10:
self.submitButton = tk.Button(self.frame,text='SUBMIT ANSWERS',command=self.submitClick)
self.submitButton.grid(row=(len(QUESTIONS)+1),column=1)
else:
self.submitButton = tk.Button(self.frame, text='SUBMIT ANSWERS', command=self.submitClick)
self.submitButton.grid(row=(len(QUESTIONS)+1),column=1)
self.root1.mainloop()
这些修改如我所愿,现在我对这个 GUI 的结果感到非常高兴!
感谢所有回复和帮助的人。
推荐阅读
- reactjs - 将 PageProps 从 Gatsby 和 Parent 传递到功能组件返回 undefined 使用 React 和 TS
- c# - Oracle 11.2.0:ORA-01017:用户名/密码无效;从 C# 连接时登录被拒绝
- excel - 如何使用特殊符号在excel vba中编写公式
- regex - 正则表达式:如何查找任何形式为 [(非引号)whatever(非引号)] 的单词
- r - 编织时,除非在 RStudio 中运行,否则 Reticulate 无法在 Python 中访问 R 变量
- python - 无头模式不起作用(python%selenuim)
- node.js - Socket.IO 服务器发送到两个客户端
- excel - 通过 for 循环插入新行以分隔数据组
- python - PyInstaller 文件打开一个 cmd 窗口并删除 .exe 文件
- python - 长度为 2 的字符串的索引 1 超出范围?