更新:我添加了更多相关代码。很抱歉遗漏。
这就是我想要做的事情:我希望我的程序界面在主窗口的右侧包含一个滚动的画布。最终,这个画布应该独立滚动,我应该能够在它上面添加小部件。
我现在所拥有的是一个良好的开端,但由于某种原因,画布既不会滚动,也不会扩展窗口的高度。
我是新来的,所以我想请你对我的无知耐心。我已大大缩短了代码,如果有需要添加的内容,请告诉我。
class MainApplication(Frame):
def __init__(self, master = None):
'''We all know what this is.'''
Frame.__init__(self, master)
mixer.init()
self.grid()
self.master = master
# Fullscreenness: from effbot.org
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (w, h))
root.grid_columnconfigure(0, weight = 3)
self.window = Frame(self, relief = SUNKEN)
self.window.grid(sticky = 'nsew')
self._menuSetup() # Generates the menubar
self._windowSetup() # Here is where the window is supposed to be
# There are a bunch of other methods skipped here
def _windowSetup(self):
'''Sets the window up'''
def onTickerConfigure(event):
self.tickerCanvas.configure(scrollregion = self.tickerCanvas.bbox('all'))
def setupRightTicker():
'''Eventually, this will be a lot more complicated, but for now it just puts some stuff into the
ticker.'''
textOne = TickerEntry('Welcome to the Brew Manager!', self)
textOne.grid(sticky = 'we')
textTwo = TickerEntry('Your Brewery Needs to be Set Up', self, self.brewerySetup)
textTwo.grid(sticky = 'we')
for test in range(20):
text = TickerEntry('This is a test entry '+str(test), self)
text.grid(sticky = 'we')
self.window.grid_columnconfigure(0, weight = 3)
self.window.grid_columnconfigure(1, weight = 1, minsize = 100)
self.rightTickerFrame = Frame(self.window, width = 100, relief = FLAT)
self.noteFrame = Frame(self.window, width = 600, relief = FLAT)
self.noteFrame.grid(row = 0, column = 0)
self.rightTickerFrame.grid(row = 0, column = 1, sticky = 'nse', ipadx = 5, ipady = 5)
self.rightTickerPad = Frame(self.rightTickerFrame, border = 0, height = 15, relief = FLAT)
self.rightTickerPad.grid()
self.tickerBox = Frame(self.rightTickerFrame, border = 1, relief = FLAT, pad = 3)
self.tickerBox.grid(sticky = 'nswe')
self.tickerCanvas = Canvas(self.tickerBox, borderwidth = 0)
self.ticker = Frame(self.tickerCanvas, borderwidth = 0)
self.tickerScroll = Scrollbar(self.tickerBox, orient = 'vertical', command = self.tickerCanvas.yview())
self.tickerCanvas.configure(yscrollcommand = self.tickerScroll.set)
self.tickerScroll.pack(side = 'right', fill = 'y')
self.tickerCanvas.pack(side = 'left', fill = 'both', expand = True)
self.tickerCanvas.create_window((4,4), window = self.ticker, anchor = 'nw', tags = self.ticker)
self.ticker.bind('<Configure>', onTickerConfigure)
# Setup the Righthand Ticker
setupRightTicker()
# Setup the notebook
noteWidth = root.winfo_screenwidth() - 300
noteHeight = root.winfo_screenheight() - 110
self.note = Notebook(self.noteFrame, width = noteWidth, height = noteHeight)
self.note.grid(sticky = 'nsw')
以下是我的代码当前生成的内容:
我的大部分代码都是基于我在这里找到的东西(stackoverflow),关于如何在Tkinter中制作滚动框架的其他问题。我确信我只是在做一些愚蠢的事情,但对于我的生活,我找不到它。
其他人可以吗?
答案 0 :(得分:0)
如果您在画布中打包/放置/网格小部件,他们将无法滚动。您需要使用create_window
方法。如果使用create_window
添加小部件,则不会影响画布的大小。你不能同时获得这两种行为,因为它们是矛盾的。
我的建议是从头开始。从可能的最小代码开始构建主窗口布局。添加画布以及您拥有的任何其他高级帧。为它们提供所有不同的颜色,以便您可以看到一个小部件结束和下一个小部件的开始。您可能需要为框架提供一个人工尺寸。执行此操作,让应用程序的主要区域显示并按预期方式运行。调整窗口大小时,请确保所有内容都正确调整大小。
然后,只有这样,才开始添加内部小部件。这样做意味着您不会立即尝试解决多个布局问题。就目前而言,您的问题可能在于您如何管理内部小部件或高级框架,或两者兼而有之。