为什么这个简单的 Python TK Gui 程序占用 100% CPU

Why does this simple Python TK Gui progam take 100% CPU

我正在尝试构建一个非常简单的 GUI,以前用这种方式完成过,从来没有问题。现在,在 Mac 上,我似乎无法让它工作。

这是代码

from Tkinter import *

class App:
    def __init__(self, master):

        # Gui Creation Block
        frame = Frame(master, bd=2, relief=SUNKEN)
        self.master = master

        self.top = Frame(frame,   height=150, width=700, relief=SUNKEN)
        self.left = Frame(frame , height=400, width=200, relief=SUNKEN)
        self.right = Frame(frame, height=400, width=500, relief=SUNKEN)

        self.top.grid(row=0, column=0, columnspan=2)

        self.left.grid(row=1, column=0)
        self.right.grid(row=1, column=1)

        # Sample Label
        self.lbl = Label(frame, text="Log file locaction" )
        self.lbl.grid(row=0, column=0)

        self.top.pack()

        frame.pack()

# Run the programs
root = Tk()
app = App(root)

root.mainloop()

一旦我 运行 那个,CPU 使用率飙升至 100% 并保持在那里,直到我硬杀死那里的 python 实例 运行。如果我注释掉标签位,那不会发生。那么这里有什么问题?

------更新------

好的,更改文件定位器的东西是的,那是一个混乱的东西。从顶部删除 pack() 解决了 100% cpu 问题。

但是,它仍然没有像我想要的那样运行。

    self.top = Frame(frame,  bg="black", height=150, width=700, relief=SUNKEN)
    self.left = Frame(frame , height=400, width=200, relief=SUNKEN)
    self.right = Frame(frame, height=400, width=500, relief=SUNKEN)

应该创建 3 个块,我可以在其中放置其他小部件,但是一旦我添加了第三个标签,就像这样;

    # Sample Label
    self.lbl = Label(self.top, text="Top" )
    self.lbl.pack()

    # Sample Label
    self.lbl2 = Label(self.left, text="Left" )
    self.lbl2.pack()

    # Sample Label
    self.lbl3 = Label(self.right, text="Right" )
    self.lbl3.pack()

它将我的整个应用程序调整为最小尺寸。 我认为内部小部件不会更改其父容器是错误的还是我犯了另一个错误?

dsgdfg 和 Jkdc 所说的:self.top.grid()self.top.pack()
不要那样做!正如您所发现的,当您在一个父项中混合 pack() & grid() 时,Tkinter 表现不佳。

至于你的更新...

Tkinter Frame 会自动调整自身大小以适合其内容。大多数情况下这是可取的,但幸运的是,当您想使用固定的帧大小时,有一种方法可以覆盖该行为。

这里是您的代码的一个稍微修改的版本,它为框架使用不同颜色的背景,以便更容易看出哪个框架在哪里。 (是的,那些颜色看起来很糟糕,但是一旦您在 GUI 中完成布局,您就会将它们更改为更好的颜色)。我在内部框架中添加了一个 borderwidth arg,以便可以看到 SUNKEN 浮雕。我还稍微调整了内部框架的定位,因为第一个标签在外部框架中的网格位置与 self.top 框架相同。此外,您尝试将 self.lbl 用于两个不同的标签。

from Tkinter import *

class App:
    def __init__(self, master):
        self.master = master

        # Gui Creation Block
        master.title("LumenScriptor")
        frame = Frame(master, bd=2, relief=SUNKEN)
        frame.pack()

        self.top = Frame(frame, bg="red", height=150, width=700, relief=SUNKEN, borderwidth=2)
        self.left = Frame(frame, bg="yellow", height=400, width=200, relief=SUNKEN, borderwidth=2)
        self.right = Frame(frame, bg="blue", height=400, width=500, relief=SUNKEN, borderwidth=2)

        self.top.grid(row=0, column=1, columnspan=2)
        self.left.grid(row=1, column=1)
        self.right.grid(row=1, column=2)

        self.top.pack_propagate(0)
        self.left.pack_propagate(0)
        self.right.pack_propagate(0)

        # Sample Label
        self.lbl = Label(frame, text="Log file location")
        self.lbl.grid(row=0, column=0)

        # Sample Label
        self.lbl1 = Label(self.top, text="Top" )
        self.lbl1.pack()

        #Sample Label
        self.lbl2 = Label(self.left, text="Left" )
        self.lbl2.pack()

        # Sample Label
        self.lbl3 = Label(self.right, text="Right" )
        self.lbl3.pack()

# Run the programs
root = Tk()
app = App(root)

root.mainloop()