Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tkinter:在脚本运行时单击其他按钮的能力

tkinter:在脚本运行时单击其他按钮的能力
EN

Stack Overflow用户
提问于 2018-09-08 17:39:09
回答 1查看 1.8K关注 0票数 0

我有一个简单的Tkinter gui,上面有大约20个按钮。当我点击一个按钮,脚本运行大约5分钟。在此期间,我必须等到脚本停止运行才单击其他按钮。是否有方法设置窗口,以便在第一个单击脚本运行时单击其他按钮?

代码语言:javascript
运行
AI代码解释
复制
from Tkinter import *
import Tkinter as tk
import time

def function1():
    time.sleep(60)
    print 'function1'


def function2():
    time.sleep(60)
    print 'function2'

root = Tk()

w = 450 # width for the Tk root
h = 500# height for the Tk root

frame = Frame(root, width=w,height =h)
button1=Button(frame, text = 'function 1',fg='black',command=function1).grid(row=1,column=1) 
button2=Button(frame, text = 'function 2',fg='black',command=function2).grid(row=1,column=2) 

frame.pack()
root.mainloop()

我希望在function2还在运行时能够单击function1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-08 18:24:04

如果触发一个需要1分钟才能运行的回调,则在1分钟内不会返回主循环,因此GUI无法响应任何内容。

对此有两种常见的解决办法。

第一个是使用后台线程:

代码语言:javascript
运行
AI代码解释
复制
def function1():
    time.sleep(60)
    print 'function1'

def function1_background():
    t = threading.Thread(target=function1)
    t.start()

button1 = Button(frame, text='function 1', fg='black', command=function1_background)

这很简单,但只有在您的代码纯粹是做后台工作时才能工作,而不涉及任何tkinter小部件。

这里唯一的问题是,您必须def 20个额外的函数。你不想重复那么多--这是80行重复的样板代码,妨碍了看到重要的代码,还有20次机会在复制粘贴中制造一个愚蠢的bug,这是很难找到的,如果你以后决定要进程而不是线程,那么就必须改变20个地方,这样工作就能更好地并行,或者一个有后台任务排队的4个线程池。

你可以用几种不同的方法解决这个问题。有关更深入的解释,请参见this question,但简而言之,您可以让Python为您做一些重复的工作。

您可以def一个帮助函数:

代码语言:javascript
运行
AI代码解释
复制
def background(func):
    t = threading.Thread(target=func)
    t.start()

…然后是lambda 20单独的函数:

代码语言:javascript
运行
AI代码解释
复制
button1 = Button(frame, text='function 1', fg='black', command=lambda: background(function1))

或者,您可以使用partial部分应用该函数。

代码语言:javascript
运行
AI代码解释
复制
button1 = Button(frame, text='function 1', fg='black', command=functools.partial(background, function1))

或者,如果您不想调用除后台之外的函数,可以编写一个装饰器并在def时将其应用于每个函数:

代码语言:javascript
运行
AI代码解释
复制
def background(func):
    @functools.wraps(func)
    def wrapper():
        t = threading.Thread(target=func)
        t.start()
    return wrapper

@background
def function1():
    time.sleep(60)
    print 'function1'

如果您不能使用线程(例如,因为后台工作涉及修改tkinter小部件),则可选择的方法是重构代码,使其不再是一个1分钟的单块任务,而是一组单独的任务,每个任务占用一秒的时间,并安排下一部分:

代码语言:javascript
运行
AI代码解释
复制
def function1(count=60):
    if count > 0:
        time.sleep(0.1)
        frame.after(0, function1, count-0.1)
    else:
        print 'function1'

button1 = Button(frame, text='function 1', fg='black', command=function1)

如果你能找到办法的话,这总是有效的。您的实际工作可能不像sleep(60)那样容易划分为0.1秒的块。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52240652

复制
相关文章
shell 字符串操作 ${} 的截取,删除,和 替换
字符串截取 字符长度 [user@host dir]$ str=123abc123 [user@host dir]$ echo ${#str} 9 从左边截取 ${string:position:length} :从字符串 string 的 position 位置截取 length 个字符串 [user@host dir]$ str=123abc123 [user@host dir]$ echo ${str:3:3} abc [user@host dir]$ echo "${str:0:${
solve
2019/10/30
8.2K1
在 Python 中的常见的几种字符串替换操作
比如,输入的字符串为’one two one two one’,第一个参数为替换前的参数,第二个为替换后的参数。默认会替换字符串中的所有符合条件的字符串。
全栈程序员站长
2022/09/07
6.4K0
java字符串操作:如何实现字符串的反转及替换?
可用字符串构造一 StringBuffer 对象,然后调用 StringBuffer 中的 reverse
MickyInvQ
2020/09/27
1.3K0
mongodb 字符串查找匹配中$regex的用法
官网地址:https://docs.mongodb.com/manual/reference/operator/query/regex/#regex-case-insensitive
庞小明
2018/12/10
6.3K0
【Kotlin】字符串操作 ② ( 字符串替换函数 replace | 字符串比较操作符 == 和 === | 字符串遍历 forEach )
对应代码中的 Regex("[ol]") , 该正则表达式的含义是 单个字符 o 或者 l ;
韩曙亮
2023/03/30
1.7K0
【Kotlin】字符串操作 ② ( 字符串替换函数 replace | 字符串比较操作符 == 和 === | 字符串遍历 forEach )
C++实现字符串的分割和替换
代码主要说明: (1)tmp.find(target):查找子串第一次出现的下标; (2)string::npos:表示未查找到子串时返回的数值。MSDN中规定,其值定义如下:static const size_type npos = -1;,转换为无符号整型unsignned int表示的是string所能容纳的最大字符数。 (3)string::size_type (由字符串配置器 allocator 定义) 描述的是 string的size,故需为无符号整数型别。因为字符串配置器缺省以类型size_t 作为 size_type。
恋喵大鲤鱼
2019/02/22
2.9K0
C++实现字符串的分割和替换
代码主要说明: (1)tmp.find(target):查找子串第一次出现的下标; (2)string::npos:表示未查找到子串时返回的数值。MSDN中规定,其值定义如下:static const size_type npos = -1;,转换为无符号整型unsignned int表示的是string所能容纳的最大字符数。 (3)string::size_type (由字符串配置器 allocator 定义) 描述的是 string的size,故需为无符号整数型别。因为字符串配置器缺省以类型size_t 作为 size_type。
恋喵大鲤鱼
2018/08/03
9310
字符串内容的替换
字符串string类有成员函数replace() string str; string s1; str.replace(pos,len,s1);//使用s1的长度为len,从str的pos位置开始替换 str.replace(pos,len,s1,pos1,len1);//使用s1的子串从pos1开始长度为len1。替换str中从pos开始长度为len的长度
杨鹏伟
2021/06/17
3.1K0
Pandas中高效的选择和替换操作总结
作为数据科学家,使用正确的工具和技术来最大限度地利用数据是很重要的。Pandas是数据操作、分析和可视化的重要工具,有效地使用Pandas可能具有挑战性,从使用向量化操作到利用内置函数,这些最佳实践可以帮助数据科学家使用Pandas快速准确地分析和可视化数据。
deephub
2023/02/01
1.3K0
Python 字符串操作(截取/替换/查找/分割)
截取字符串使用 变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。
IT工作者
2022/07/07
2.8K0
js替换html中的字符串,js怎么替换字符串?
在js中,可以使用str.replace()方法来替换字符串。replace()方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串;然后返回一个新的字符串。
全栈程序员站长
2022/08/30
24.1K0
js替换html中的字符串,js怎么替换字符串?
Makefile中的字符串替换
Makefile Tutotial最后给出了一段makefile,里面OBJS有字符串通配、替换的过程:
mingjie
2023/10/13
7170
删除字符串中的子串(C++ regex求解)
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
喜欢ctrl的cxk
2019/11/07
3.5K0
字符串替换
每行数据是一个字符串,长度不超过1000  数据以EOF结束输出对于输入的每一行,输出替换后的字符串样例输入
书童小二
2018/09/03
3K0
Java中替换字符串的方法
1. replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了就是字符串的意思)。
bisal
2021/10/15
5.9K0
字符串中符号的替换---replace的用法
1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 int main() 7 { 8 string s1 = "one*two*three";//Given String 9 string s2 = "*";//delimeter 10 string s3 = ",";//string to replace 11
猿人谷
2018/01/17
3.8K0
字符串中符号的替换---replace的用法
Java基础入门之字符串的转换、替换、删除和判断
1.在开发过程中,有时需要对字符串的转换操作,例如字符串的字母大小写转换把”abc”转换成”ABC”,基本数据类型转换成字符串、字符数组转换成字符串,字符串转成数组的形式等。
Java进阶者
2021/03/29
9850
php 字符串替换中文,PHP中文字符串替换其中为*的方法
在项目中需要对字符串的部分进行隐藏或者替换。譬如手机号码的中间几位进行隐藏,中文名字的中间替换为*号等。
全栈程序员站长
2022/08/25
8K0
基于PHP中自带的字符串操作函数合集
strpos($str,search,[int])://查找search在$str中的第一次位置从int开始; strrpos($str,search,[int])://查找search在$str中的最后一次出现的位置从int开始
用户2323866
2021/07/01
6500
点击加载更多

相似问题

基于Regex的字符串替换操作不起作用

10

字符串操作/regex-查找和替换

11

基于Java Regex的字符串替换

22

基于位置替换字符串部分的Regex

46

Python -基于regex检索和替换

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档