所以我正在尝试创建一个程序,实时显示计算机的CPU使用情况。我想用tkinter为程序添加一些按钮。我决定添加一个关闭程序的停止按钮和一个暂停按钮来停止更新cpu使用。我能够创建停止按钮但是当我启动暂停按钮时,我意识到我无法暂停我使用的while循环。有谁知道我做错了什么?
from tkinter import *
import psutil
from time import sleep
root = Tk()
var = StringVar()
label = Label( root, textvariable=var, relief=GROOVE, height=3, width=6, bd=4)
f = Frame(root, height=100, width=180)
f.pack_propagate(0)
f.pack()
stop=0
def pause1():
stop=1
print('It works')
def findcpu():
if stop==0:
root.update()
sleep(0.001)
cpu = psutil.cpu_percent(interval=1, percpu=False)
var.set(cpu)
label.pack()
root.update()
elif stop==1:
print('It really works')
loop=1
class pauseButton(Button):
def __init__(self, parent):
Button.__init__(self, parent)
self['text']= 'pause'
self['bg']='orange'
self['height']=3
self['width']=6
self['bd']=4
self['relief']=GROOVE
self.button=Button(self)
self['command']=pause1
self.pack(side=LEFT)
class quitButton(Button):
def __init__(self, parent):
Button.__init__(self, parent)
self['text'] = 'End'
self['bg']='red'
self['height']=3
self['width']=6
self['bd']=4
self['padx']=0
self['pady']=0
self['relief']=GROOVE
self['activebackground']='brown'
self.button = Button(self)
self['command'] = parent.destroy
self.pack(side=RIGHT)
quitButton(root)
pauseButton(root)
loop=0
stop=0
num1=0
num2=1
while loop==0:
findcpu()
root.mainloop()
print('Done')
答案 0 :(得分:1)
您使用变量stop和loop作为全局变量,但是您将其作为局部变量进行修改,因此全局副本保持不变为初始化值。只需要显式声明变量循环并停止为全局,以指示您想要访问全局副本,因为如果没有指定它将默认为本地范围
将下面的行添加到pause1和findcpu函数
global stop, loop
答案 1 :(得分:0)
场景是我创建一个弹出式GUI - 确定按钮
然后我想等待用户点击OK继续
问题:我单独在python中创建一个循环,这会“锁定”GUI部分的更新。
事实上即使我指示Tk创建一个Button弹出窗口,它也不会弹出。
我找到的解决方案是
1)使用“更新”强制刷新TK while(self.wait_for_operator.get()):
root.update()
root.update_idletasks()
2)我使用一个名为IntVar的特殊TK变量
“没有办法跟踪Python变量的变化,但是Tkinter允许你创建可以在Tk可以使用跟踪的Tcl变量的任何地方使用的变量包装器。”
当用户按下OK按钮
时设置此值1)和2)的组合意味着我能够成功地从GUI创建用户控制的循环。
相关的代码部分是
self.wait_for_operator.set(1) self.button = Button(self.top, text="OK", command= self._handle_start_key_and_serial_input) self.button.pack() while (self.wait_for_operator.get()): root.update() root.update_idletasks()
def _handle_start_key_and_serial_input(self):
self.wait_for_operator.set(0)
self.top.destroy()