[英]Issues with Python Tkinter: Frames within a Canvas
我正在尝试设置一系列可滚动的框架,因此将它们嵌套在画布中。 下面,我提供了一些示例代码来演示该问题。
但是,我有三个问题:
c
似乎没有水平扩展以填充画布。 c
,则画布滚动,但是如果我尝试将FrameRow
嵌套到单个框架c
,则画布将不再滚动。 c
,将切除FrameRow
的最后一个。 按钮“左”和“右”演示了当按钮未嵌套在Canvas中时得到的行为。
我更喜欢使用单个Frame c
并在其中嵌套所有FrameRows
,但是我需要滚动才能正常工作。
import * from Tkinter
import FrameRow
root = Tk()
root.title("Testing")
containerFrame = Frame(root)
containerFrame.config(bg="red")
containerFrame.pack(side=TOP, fill=BOTH, expand=1)
# Frame showing proper behavior
a = Frame(containerFrame, bg="black")
a.pack(side=TOP, fill=X, expand=0)
btnLeft = Button(a)
btnLeft.config(text="LEFT")
btnLeft.pack(side=LEFT, fill=X, expand=1)
btnRight = Button(a)
btnRight.config(text="RIGHT")
btnRight.pack(side=RIGHT, fill=X, expand=0)
# Canvas
canvas = Canvas(containerFrame)
scrollbar = Scrollbar(containerFrame, orient=VERTICAL)
scrollbar.config(command=canvas.yview)
canvas.config(bg="blue", yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)
canvas.pack(side=LEFT, fill=BOTH, expand=1)
# Multiple Frames within Canvas
frameRow = range(30)
c = range(30)
for r in xrange(0,30):
c[r] = Frame(canvas)
c[r].config(bg="green")
frameRow[r] = FrameRow.FrameRow()
frameRow[r].setFrame(c[r])
frameRow[r].setRow(r)
frameRow[r].createRow()
c[r].pack(side=TOP, fill=X, expand=1)
canvas.create_window(0, (r+1)*30, window=c[r], anchor="nw")
canvas.config(scrollregion = canvas.bbox(ALL))
# OR
# Single Frame within Canvas
##c = Frame(canvas)
##c.config(bg="green")
##
##frameRow = range(30)
##for r in xrange(0,30):
## frameRow[r] = FrameRow.FrameRow()
## frameRow[r].setFrame(c)
## frameRow[r].setRow(r)
## frameRow[r].createRow()
##
##c.pack(side=TOP, fill=X, expand=1)
##canvas.create_window(0, 0, window=c, anchor="nw")
root.mainloop()
FrameRow
类定义为:
from Tkinter import *
class FrameRow():
_frame = "Default"
_row = 0
def setFrame(self, frame):
self._frame = frame
def setRow(self, row):
self._row = row
def createRow(self):
self.frameRow = Frame(self._frame)
self.frameRow.config(bg="yellow")
self.frameRow.pack(side=TOP, fill=X, expand=1)
self.btn1 = Button(self.frameRow)
self.btn1.config(text="Button "+str(self._row)+"A")
self.btn1.pack(side=LEFT, fill=X, expand=1)
self.btn2 = Button(self.frameRow)
self.btn2.config(text="Button "+str(self._row)+"B")
self.btn2.pack(side=RIGHT, anchor=E, fill=X, expand=0)
使Frame c
扩展到画布的宽度时,我缺少什么吗?
我在滚动和单个Frame c
做错什么了吗?
是否有任何体面的教程或示例说明我应该如何做?
谢谢!
好像您都将窗口包装在画布中并创建了一个窗口对象。 老实说,我从来没有做过,但我认为包装没有任何好处。
当您创建作为画布中对象的窗口小部件时,它将不会展开以填充画布。 您需要做的是为画布的<Configure>
事件创建一个绑定。 每当画布更改大小(以及其他几次)时,就会触发此事件。 然后,您可以调整每个框架的大小以适合画布的宽度。
既然您说您喜欢使用单个框架,将其他行嵌套在其中,那么这可能是最简单的解决方案。 但是同样,单个框架不会增长或缩小以适合画布,您必须使用<Configure>
绑定来完成。
请确保您配置画布的scrollregion添加框架使用画布后 create_window
。 看来您忘记了在注释掉的代码中执行此操作,这肯定会阻止画布滚动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.