Python:Tkinter暂停while循环

时间:2016-10-30 01:27:43

标签: python tkinter

所以我正在尝试创建一个程序,实时显示计算机的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')

2 个答案:

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