吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2900|回复: 9
收起左侧

[已解决] Python tkinter 等待按钮点击

[复制链接]
bluerabbit 发表于 2019-8-26 10:13
本帖最后由 bluerabbit 于 2019-8-26 16:30 编辑

在用tkinter写一个gui,主要有三个组件--一个TEXT控件,两个按钮(Yes 和 No)。目的是把主程序运行中产生的一些log写入TEXT控件,在某些时候会问 yes/no 的问题(也会写在TEXT控件中),此时需要用户点击两个按钮中的一个,并把 'y' 或 'n' 赋给一个变量,根据这个变量得到的值(y或n)来控制接下来程序的走向。
现在的问题是:在等待用户点击按钮时,主程序相当于要暂停,按钮点击后还要返回主程序,这个要怎么实现呢?本来是像下面这样写的(flag已申明全局变量),但运行时好像就进入了死循环,改成用threading来调用check_flag()也是一样
[Python] 纯文本查看 复制代码
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
直接主线程 调用这个,会阻塞在这里等待结果的

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
bluerabbit + 1 + 1 谢谢@Thanks!

查看全部评分

井右寺 发表于 2019-8-26 11:12
本帖最后由 井右寺 于 2019-8-26 11:24 编辑

如果是不想打扰用户的话,代码改成这样
啊哈哈,忘了线程启动
[Python] 纯文本查看 复制代码
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
如果是不想打扰用户的话,代码改成这样
啊哈哈,忘了线程启动[mw_shl_code=python,true]
def thread_run( ...

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

不应该啊
谁获取了锁 没释放吗?
不过第二种方式 的确没第一种的好
应该是可以通过队列来完成无打断输入获取的。。。。恩,懒得看。。。。
哈哈哈,还是直接弹窗最简单。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表