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

时间:2015-09-17 11:21:31

标签: python tkinter cpu-usage

我正在尝试构建一个非常简单的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()

它将我的整个应用调整为最小尺寸。 我错误地认为内部小部件不会改变他们的父容器或我是否犯了另一个错误?

1 个答案:

答案 0 :(得分:4)

dsgdfg& Jkdc说:你有self.top.grid()self.top.pack() 别这么做!正如您所发现的那样,当您混合使用pack()&时,Tkinter的表现并不好。父母一方grid()

至于你的更新......

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