为什么tkinter不抛出/引发异常?

时间:2019-01-07 18:19:43

标签: python tkinter

问题是,如果您在下面运行此代码并调整窗口大小,则会得到 意外行为。小部件未按应有的方式呈现出来,背景也没有呈现 有一些奇怪的颜色。

我知道如果您设置了一个参数,那么您应该 用有效性值填充它。如果您确实像我一样用空字符串填充它 它不会抛出<_tkinter.TclError:未知颜色名称“”>。

我的问题是为什么我们 没有收到错误?那是tkinter的错误吗?因为如果您设置Canvas的bg参数 作为一个空字符串,您将得到一个错误:颜色名称未知“”

from tkinter import Tk, Frame, Button, Entry, Canvas

class Gui(Frame):
    def __init__(self, master):
        self.master = master
        self.font1 = font=("Segoe UI",18,"bold")
        self.font2 = font=("Segoe UI",28,"bold")
        Frame.__init__(self, self.master, bg="")
        self.grid()  
        self.create_widgets()

    def create_widgets(self):   
        self.frame_container = Frame(self, bg="")       
        self.frame_container.grid(row=0, column=0)
        self.button_test_1 = Button(self, text="Test1", bg="yellow")
        self.button_test_1.grid()
        self.can = Canvas(self.frame_container, bg="orchid1")
        self.can.grid(row=0, column=0)
        self.entry_test = Entry(self.frame_container)
        self.entry_test.grid(row=0, column=1)            

if __name__ == "__main__":
    root = Tk()
    bug_gui = Gui(root)
    root.mainloop()

1 个答案:

答案 0 :(得分:0)

@Idlehands感谢您引用Fredrik Lundh在background上的effbot.org解释。我想我终于了解了Fredrik Lundh的文档。即

  1. bg=""是一个有效的参数,它将阻止更新Frame小部件的背景,并且
  2. background小部件的bgFrame默认为应用程序背景色。

因此,当调整Tk窗口的大小时,例如当Tk窗口的右边缘向左移动以到达Canvas小部件的右边缘,然后向右移动回到其原始位置时,会发生以下现象:

  1. 首先,Frame小部件的宽度减小了大小。发生这种情况时,我怀疑填充Tk小部件的Frame寡妇背景色会丢失。
  2. 第二,当Frame小部件的宽度接下来恢复到其原始大小时,需要使用定义的颜色更新(即填充)其背景。因为bg=""阻止更新,即阻止用定义的背景色填充Frame小部件背景,所以Frame小部件的背景将默认为“应用程序背景色”。意思是它将用Frame小部件和Tk窗口正后方区域的确切颜色填充,就好像它是“透明的”一样。

正在回答@Turjak_art问题,tkinter不会产生错误或异常,因为bg=""Frame小部件的有效参数。

编辑:

该图像显示了具有快速调整大小的框架背景。
bg="" fast resizing

图像显示框架背景且调整大小缓慢。 bg="" slow resizing