为什么我所谓的滚动画布不滚动,或延伸包含框架的高度?

时间:2014-04-18 12:33:22

标签: python canvas tkinter scrollbar

更新:我添加了更多相关代码。很抱歉遗漏。

这就是我想要做的事情:我希望我的程序界面在主窗口的右侧包含一个滚动的画布。最终,这个画布应该独立滚动,我应该能够在它上面添加小部件。

我现在所拥有的是一个良好的开端,但由于某种原因,画布既不会滚动,也不会扩展窗口的高度。

我是新来的,所以我想请你对我的无知耐心。我已大大缩短了代码,如果有需要添加的内容,请告诉我。

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')

以下是我的代码当前生成的内容: Image of my Tkinter interface

我的大部分代码都是基于我在这里找到的东西(stackoverflow),关于如何在Tkinter中制作滚动框架的其他问题。我确信我只是在做一些愚蠢的事情,但对于我的生活,我找不到它。

其他人可以吗?

1 个答案:

答案 0 :(得分:0)

如果您在画布中打包/放置/网格小部件,他们将无法滚动。您需要使用create_window方法。如果使用create_window添加小部件,则不会影响画布的大小。你不能同时获得这两种行为,因为它们是矛盾的。

我的建议是从头开始。从可能的最小代码开始构建主窗口布局。添加画布以及您拥有的任何其他高级帧。为它们提供所有不同的颜色,以便您可以看到一个小部件结束和下一个小部件的开始。您可能需要为框架提供一个人工尺寸。执行此操作,让应用程序的主要区域显示并按预期方式运行。调整窗口大小时,请确保所有内容都正确调整大小。

然后,只有这样,才开始添加内部小部件。这样做意味着您不会立即尝试解决多个布局问题。就目前而言,您的问题可能在于您如何管理内部小部件或高级框架,或两者兼而有之。