对Tkinter和Python比较陌生。所以请容忍我。
我正试图显示下面的图形用户界面,并希望在Frame2中有一个滚动条,一次只显示5x5个按钮。看起来Tkinter帧不支持滚动条,因此在父帧“FMas”中添加了画布(其中嵌入了帧)和滚动条。但由于某些原因,滚动条会转到屏幕的右端,不进行任何滚动。
画布不应该在Frame2的边缘结束,滚动条就在它的旁边吗?另外,我尝试rowspan增加滚动条的高度,以匹配5x5按钮的高度。那也不行。
代码(使用Python3.2):
from tkinter import *
import tkinter.ttk as ttk
mGui = Tk()
mGui.geometry("630x600")
mGui.configure(background="Gray")
mGui.columnconfigure(0, weight=1)
mGui.rowconfigure(0, weight=1)
FMas = Frame(mGui, bg="Gray")
FMas.grid(sticky=(N,E,S,W))
FMas.columnconfigure(0, weight=1)
L1 = Label(FMas, text="Frame 1 Contents")
L1.grid(row=0, column=0, pady=5, sticky=(N,W))
F1 = Frame(FMas, bg="Green", bd=2, relief=GROOVE)
F1.grid(row=1, column=0, sticky=(N,W))
ChkBox1=IntVar()
CB1 = Checkbutton(F1, text="StartCheckBox", variable=ChkBox1)
CB1.grid(row=0,column=0,padx=2)
L2 = Label(FMas, text="Frame 2 Contents")
L2.grid(row=2, column=0, pady=5, sticky=(N,W))
Can1 = Canvas(FMas, bg="Yellow")
Can1.grid(row=3, column=0, sticky=(N,W))
F2 = Frame(Can1, bg="Blue", bd=2, relief=GROOVE)
F2.grid(row=0, column=0, sticky=(N,W))
rows = 10
for i in range(1,rows):
for j in range(1,6):
button = Button(F2, padx=7, pady=7, text="[%d,%d]" % (i,j))
button.grid(row=i, column=j, sticky='news')
vsbar = Scrollbar(FMas, orient="vertical", command=Can1.yview)
vsbar.grid(row=3, column=1)
Can1.configure(yscrollcommand=vsbar.set, scrollregion=Can1.bbox("all"))
L3 = Label(FMas, text="Frame 3 Contents")
L3.grid(row=4, column=0, pady=5, sticky=(N,W))
F3 = Frame(FMas, bg="Red", bd=2, relief=GROOVE)
F3.grid(row=5, column=0, sticky=(N,W))
ChkBox2=IntVar()
CB2 = Checkbutton(F3, text="EndCheckBox", variable=ChkBox2)
CB2.grid(row=0,column=0,padx=2)
mGui.mainloop()
sys.exit()
滚动条的高度与按钮的框架高度不匹配,因为您没有告诉它保持南北方向
.grid(..., sticky='ns')
然后,您要实现的滚动行为描述如下:Adding a Scrollbar to a group of widgets
另请参阅@martineau的答案,以获得更通用的二维滚动(水平和垂直)面向对象解决方案
虽然这是一个有些过时的问题,但这里有一个不同的答案,它不使用
tkinter
事件处理,从而避免了它所需的不必要的开销。尽管代码是从OP派生的,但我已经对代码格式进行了许多更改,使其更好地符合PEP 8 - Style Guide for Python Code的要求,这导致许多变量名被更改。我还修改了体系结构,使应用程序成为根窗口小部件类的一个子类。我做这些事情的目的是希望结果更容易理解,并为编写类似的基于
tkinter
的应用程序提供更好的模板。就像@Josselin的答案一样,它将
Canvas
和每个Scrollbar
小部件嵌套在另一个Frame
中,这样就可以使用tkinter
的grid()
布局管理器轻松地将它们垂直和水平放置在一起。代码已经进一步扩展,因此网格还具有一个水平滚动条,允许在该方向和垂直方向滚动其内容。
下面是跑步的样子:
相关问题 更多 >
编程相关推荐