【问题标题】:Why does this simple Python TK Gui progam take 100% CPU为什么这个简单的 Python TK Gui 程序占用 100% CPU
【发布时间】:2015-09-18 21:49:08
【问题描述】:

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

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

【问题讨论】:

  • 打包,网格在一起?仅使用网格方法!
  • 你在self.top上同时使用了pack和grid。
  • Tkinter Frame 会自动调整自身大小以适应其内容,但有一种方法可以覆盖该行为。我会尽快发布一些代码。
  • 顺便说一句,在你的问题得到回答后大幅改变你的问题并不是一个好主意:你应该问一个新问题。但这次我会让你侥幸逃脱,因为你的第一个问题很简单。 :)

标签: python tkinter cpu-usage


【解决方案1】:

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

【讨论】:

  • 好的,改变了文件定位器是的,那是一个凌乱的。并且从顶部删除 pack() 解决了 100% cpu 问题。
  • 优秀且富有洞察力。谢谢。好像我很马虎,可能累了。
  • @Eloque:别担心。列号和行号之类的东西很容易搞砸。因此,您只需要在添加内容时继续测试您的代码,这样您就可以在错误发生时立即修复,而不是在添加另外 50 个小部件之后。 :) PS。你现在有足够的代表来投票:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2023-03-06
  • 2014-09-16
  • 2021-04-21
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多