bluerabbit 发表于 2019-8-26 10:13

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

mzhsohu 发表于 2019-8-26 10:38

Python语言貌似挺火啊~!感谢分享~!

ee789852 发表于 2019-8-26 10:59

进来学习,等大神帮忙解答

井右寺 发表于 2019-8-26 11:07

tkinter.messagebox.askokcancel
直接主线程 调用这个,会阻塞在这里等待结果的

井右寺 发表于 2019-8-26 11:12

本帖最后由 井右寺 于 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)

yanmingming 发表于 2019-8-26 12:45

学习到了

bluerabbit 发表于 2019-8-26 16:28

井右寺 发表于 2019-8-26 11:07
tkinter.messagebox.askokcancel
直接主线程 调用这个,会阻塞在这里等待结果的

原来messagebox 还可以像vb里这样用,学习了!谢谢!

bluerabbit 发表于 2019-8-26 16:43

井右寺 发表于 2019-8-26 11:12
如果是不想打扰用户的话,代码改成这样
啊哈哈,忘了线程启动
def thread_run( ...

这种方法试了试,还是陷入死锁……再研究研究
总之,多谢啦!

井右寺 发表于 2019-8-26 22:18

bluerabbit 发表于 2019-8-26 16:43
这种方法试了试,还是陷入死锁……再研究研究
总之,多谢啦!

不应该啊
谁获取了锁 没释放吗?
不过第二种方式 的确没第一种的好
应该是可以通过队列来完成无打断输入获取的。。。。恩,懒得看。。。。
哈哈哈,还是直接弹窗最简单。
页: [1]
查看完整版本: Python tkinter 等待按钮点击