Python tkinter 等待按钮点击
本帖最后由 bluerabbit 于 2019-8-26 16:30 编辑在用tkinter写一个gui,主要有三个组件--一个TEXT控件,两个按钮(Yes 和 No)。目的是把主程序运行中产生的一些log写入TEXT控件,在某些时候会问 yes/no 的问题(也会写在TEXT控件中),此时需要用户点击两个按钮中的一个,并把 'y' 或 'n' 赋给一个变量,根据这个变量得到的值(y或n)来控制接下来程序的走向。
现在的问题是:在等待用户点击按钮时,主程序相当于要暂停,按钮点击后还要返回主程序,这个要怎么实现呢?本来是像下面这样写的(flag已申明全局变量),但运行时好像就进入了死循环,改成用threading来调用check_flag()也是一样
def button_yes(): #YES按钮绑定
flag = 'y'
def button_no(): #NO按钮绑定
flag = 'n'
def check_flag(): #主程序在提出yes/no问题后,会调用这个函数
if flag in ('y', 'n'):
return flag #返回主程序
else:
time.sleep(5)
check_flag() Python语言貌似挺火啊~!感谢分享~! 进来学习,等大神帮忙解答 tkinter.messagebox.askokcancel
直接主线程 调用这个,会阻塞在这里等待结果的 本帖最后由 井右寺 于 2019-8-26 11:24 编辑
如果是不想打扰用户的话,代码改成这样
啊哈哈,忘了线程启动
def thread_run(func):
run(*args,**kwargs):
t = threading.Thread(target=func, args=args, kwargs=kwargs)
t.daemon = True
t.start()
return run
lock = threading.Lock()
@thread_run
def button_yes(): #YES按钮绑定
if lock.acquire():
flag = 'y'
lock.release()
@thread_run
def button_no(): #NO按钮绑定
if lock.acquire():
flag = 'n'
lock.release()
def check_flag(): #主程序在提出yes/no问题后,会调用这个函数
if lock.acquire():
flag = 'False'
lock.release()
while not flag in ('y','n'):
time.sleep(1) 学习到了 井右寺 发表于 2019-8-26 11:07
tkinter.messagebox.askokcancel
直接主线程 调用这个,会阻塞在这里等待结果的
原来messagebox 还可以像vb里这样用,学习了!谢谢! 井右寺 发表于 2019-8-26 11:12
如果是不想打扰用户的话,代码改成这样
啊哈哈,忘了线程启动
def thread_run( ...
这种方法试了试,还是陷入死锁……再研究研究
总之,多谢啦! bluerabbit 发表于 2019-8-26 16:43
这种方法试了试,还是陷入死锁……再研究研究
总之,多谢啦!
不应该啊
谁获取了锁 没释放吗?
不过第二种方式 的确没第一种的好
应该是可以通过队列来完成无打断输入获取的。。。。恩,懒得看。。。。
哈哈哈,还是直接弹窗最简单。
页:
[1]