Python Tkinter动态滚动条大小调整问题

时间:2018-07-26 09:46:43

标签: python tkinter resize

我在Python上编写了具有动态调整大小的GUI,我的意思是,如果窗口的所有元素的高度大于窗口的高度,则滚动条将显示在右侧,但是如果我调整窗口的大小并所有元素的高度均小于窗口,滚动条消失。 我已经使用<Configure>事件来做到这一点。这是我使用的代码的一部分:

    mycanvas = Canvas(self.parent,bd=0,highlightthickness=0,relief='flat')
    sbar = tk.Scrollbar(mycanvas,orient='vertical')
    sbar.config(command=mycanvas.yview)
    mycanvas.config(yscrollcommand=sbar.set)

    def canvasscroll(event):
        mycanvas.yview('scroll',int(-1*(event.delta/120)), "units")
    def resizecanvas(event):
        if self.mainyposition > event.height: #mainyposition is the addition of the height of all widgets in screen
            sbar.pack(side=RIGHT, fill=Y)
        else:
            sbar.forget()
        print(event.height)

    self.widgetname.bind_all("<MouseWheel>", canvasscroll)
    self.widgetname.bind_all("<Configure>", resizecanvas)

除以下两个问题外,一切都正常运行

首先,当窗口启动时,<Configure>事件将被调用几次,并在屏幕上打印高度,但是在程序仍待命之前其最后一次调用的高度是不是正确的窗口高度,所以这会不必要地显示滚动条。一旦我调整窗口大小并再次运行事件,问题便自行解决,但是第一次运行时,它无法执行此操作。有什么办法解决这个问题?

第二,在调整大小期间,控制台没有显示任何错误,但是当我关闭窗口时,它向我显示了引用滚动条的Exception in Tkinter Callback方法的pack()。我不知道该怎么解决...错误是这样的:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1702, in __call__
      return self.func(*args)
  File "Y:\Factory\GLP2-e Admin (Todos los archivos)\Nueva Interfaz\classmain.py", line 108, in resizecanvas
      sbar.pack(side=RIGHT, fill=Y)
  File "C:\Python34\lib\tkinter\__init__.py", line 2140, in pack_configure + self._options(cnf, kw))
  _tkinter.TclError: bad window path name ".!canvas.!scrollbar"
  Exception in Tkinter callback
  Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1702, in __call__
      return self.func(*args)
  File "Y:\Factory\GLP2-e Admin (Todos los archivos)\Nueva Interfaz\classmain.py", line 108, in resizecanvas
  sbar.pack(side=RIGHT, fill=Y)
  File "C:\Python34\lib\tkinter\__init__.py", line 2140, in pack_configure + self._options(cnf, kw))
  _tkinter.TclError: bad window path name ".!canvas.!scrollbar"
  Exception in Tkinter callback
  Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1702, in __call__
      return self.func(*args)
  File "Y:\Factory\GLP2-e Admin (Todos los archivos)\Nueva Interfaz\classmain.py", line 108, in resizecanvas
      sbar.pack(side=RIGHT, fill=Y)
  File "C:\Python34\lib\tkinter\__init__.py", line 2140, in pack_configure + self._options(cnf, kw))
  _tkinter.TclError: bad window path name ".!canvas.!scrollbar"
  [Finished in 22.3s]

谢谢大家。

0 个答案:

没有答案