繁体   English   中英

为什么这个简单的Python TK Gui progam占用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中完成了布局,就可以将它们更改为更好的颜色)。 并且我向内部Frames添加了borderwidth arg,以便可以看到SUNKEN浮雕。 我还调整了内部框架的位置,因为您在外部框架中的第一个Label与self.top框架在同一网格位置。 另外,您试图将self.lbl用于两个不同的Labels。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM