首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么函数不运行?

为什么函数不运行?
EN

Stack Overflow用户
提问于 2022-03-18 22:40:34
回答 2查看 123关注 0票数 1

好的,下面的代码有多个问题:

  1. 当按住在组合框中选择的键时,它会一直打印"You按下它“,有什么方法可以避免这种情况呢?
  2. 当我按下设置的热键时,标签会发生变化,但是进程()中的while循环不会,它应该做一个任务过程,但是我简化了它以打印这个问题。

代码语言:javascript
运行
AI代码解释
复制
run = False

def press():
    global run
    while True:
        if keyboard.read_key(hotCombo.get()):
            print("You Pressed It")
            run = not run
            keyboard.wait(hotCombo.get())
            if run == True:
                status["text"]="Working"
            else:
                status["text"]="Not Working"
            
def process():
    while run == True:
        print("runnning")

一直在修补它,发现了更多的问题

我最终得到了这个,但当它打印run时,我似乎无法阻止它。

代码语言:javascript
运行
AI代码解释
复制
def process():
    global run
    while True:
        if keyboard.read_key(hotCombo.get()):
            print("kijanbdsjokn")
            run = not run
            keyboard.wait(hotCombo.get())
            if run == True:
                status["text"]="Working"
            else:
                status["text"]="Not Working"
            while run == True:
                print("run")
                time.sleep(1)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-19 00:01:58

我能问一下为什么我不能使用线程将tkinter集成到运行中的python脚本中吗?

Python脚本通常是线性的。你按顺序做事然后退出。

tkinter程序中,代码由三部分组成。

设置全局变量的窗口和widgets.

  • Initialization的
  • 代码(如果将它们隐藏在类实例中并不重要;它们仍然是全局变量)。

因此,在tkinter程序中,大部分代码都是mainloop中的来宾。在那里,它是小块执行,以回应事件。这是一个完全不同的节目。它被称为事件驱动或基于消息的编程,很久以前,它在web服务器和框架中变得很酷。

那么,您能在tkinter程序中集成一个脚本吗?是的,这是可能的。基本上有三种方法可以做到;

  • 将代码分割成小块,可以通过after超时来调用。这涉及到您的代码的大部分重组。为了保持GUI响应,事件处理程序(如超时)不应该花费太长时间;50 ms似乎是一个合理的上限。
  • 在不同的线程中运行它。我们将在下面更详细地讨论这个问题。
  • 在另一个过程中运行它。大致上类似于线程中的运行( threading.Threadmultiprocessing.Process的API在设计上几乎相同)。最大的区别是进程之间的通信必须通过例如QueueQueue显式地完成。

在使用额外的线程时,特别是在tkinter程序中,您必须考虑到一些事情。

1) Python版本

您需要使用Python 3,这在Python 2中不能很好地工作,原因超出了这个答案的范围。在Python 3中更好地抢占线程是其中的一个重要部分。

2)多线程tkinter构建

tkinter (或者更确切地说是底层tcl解释器)需要在启用线程的情况下构建。我想官方的python.org是为ms-windows构建的,但除了这个YMMV之外。在一些类似UNIX的系统上,例如Linux或*BSD,包/端口系统在这方面提供了一个选择。

3)将代码变成函数

您需要将原始脚本的核心封装在一个函数中,这样就可以在线程中启动它。

4)使函数线程友好的

如果需要太长时间,您可能希望能够中断该线程。所以你必须调整它,以定期检查它是否应该继续。检查全局名为run是否为True是一种方法。请注意,threading API不允许您只终止线程。

5多线程的正常危险

您必须小心同时从两个线程修改小部件或全局。

在编写本报告时,Python在这里帮助您。由于它确保一次只有一个线程正在执行Python字节码,因此在单个字节码中可以执行的任何更改都是多线程安全的,这是一个副作用。

例如,查看modify函数中全局的修改:

代码语言:javascript
运行
AI代码解释
复制
In [1]: import dis

In [2]: data = []
Out[2]: []

In [3]: def modify():
   ...:     global data
   ...:     newdata = [1,2,3]
   ...:     data = newdata
   ...:     

In [4]: dis.dis(modify)
  3           0 BUILD_LIST               0
              2 LOAD_CONST               1 ((1, 2, 3))
              4 LIST_EXTEND              1
              6 STORE_FAST               0 (newdata)

  4           8 LOAD_FAST                0 (newdata)
             10 STORE_GLOBAL             0 (data)
             12 LOAD_CONST               0 (None)
             14 RETURN_VALUE

查看新列表是如何单独构建的,并且只有在组合时才将其分配给全局列表。(这不是偶然的。)

只需一个字节码指令(STORE_GLOBAL)就可以将全局变量设置为新创建的列表。因此,data的值在任何时候都不能模棱两可。

但是很多事情需要的不仅仅是一个字节码。因此,在修改变量或小部件时,一个线程有可能被抢占而对另一个线程有利。这是一个多大的机会,取决于这些情况发生的频率和时间。

IIRC,目前每15 ms抢占一条线程。因此,一个需要更长时间的改变肯定会被抢占。就像任何为了I/O丢弃吉尔的任务一样。

因此,如果您看到奇怪的事情发生,请确保使用Lock来规范对共享资源的访问。

如果小部件或变量只从一个线程修改,而只从其他所有线程读取,则会有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2022-03-18 22:53:14

处理密钥的一种方法是将其转换为一个两阶段循环:

代码语言:javascript
运行
AI代码解释
复制
def press():
    global run
    while True:
        while not keyboard.read_key(hotCombo.get()):
            time.sleep(0.2)
        run = True
        status["text"]="Working"
        while keyboard.read_key(hotCombo.get()):
            print("running")
            time.sleep(0.2)
        run == False
        status["text"]="Not Working"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71535935

复制
相关文章
使用此 Microsoft Sentinel 工作簿获得动手 KQL
Kusto 查询语言 (KQL) 是使用 Microsoft Sentinel 的驱动语言。尽管类似于 SQL,但新用户仍必须学习和练习该语言。为了帮助加速学习语言,我们创建了一个交互式学习工作簿。当前版本将帮助新用户或现有用户对语言有 100-200 级的理解,同时还提供实践经验,帮助他们在执行现实世界的查询时迅速上手。
Khan安全团队
2022/01/14
1.8K0
WPF 设置元素为 Collapsed 是否会创建此元素
在 WPF 的 XAML 中,如果将某个元素初始的时候设置 Visibility 为 Collapsed 的值,那么意味着这个元素将不会参与布局,就和不存在是一样的。那么这个元素是否会被创建在内存中?是会创建的
林德熙
2020/11/27
1.1K0
元素弹性布局
table布局在早期是很流行的,因为使用table布局的表格结构清晰,易于理解,表格结构支持行列跨度,可以实现复杂的布局,但是他也有缺点,不利于SEO,复杂的页面代码也非常复杂,难以维护,不支持响应式布局,在移动端上不能很好的适配
云叶知秋
2023/10/16
1340
元素弹性布局
【HTML】HTML5 <div>元素布局的使用
标签可以把文档分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使用任何格式与其关联。
梦溪
2021/08/09
4.1K0
Mybatis的sql映射文件的顶级元素使用实例
Mybatis是是一款优秀的持久层框架(持久化是程序数据在瞬时状态和持久状态间转换的过程。),在dao层大量使用,使sql语句封装在配置文件中,降低程序的耦合度。
jiankang666
2022/05/13
5080
Mybatis的sql映射文件的顶级元素使用实例
js通过class name获得元素
//原理: 用document.getElementsByTagName('*');来获取所有元素,然后取得相同Class的元素。 function getElementsByClassName(n) { var classElements = [], allElements = document.getElementsByTagName('*'); for (var i = 0; i < allElements.length; i++) { if (allElements[
sunsky
2020/08/20
8.9K0
Java 如何从一个 List 中随机获得元素
从一个 List 中随机获得一个元素是有关 List 的一个基本操作,但是这个操作又没有非常明显的实现。
HoneyMoose
2022/05/07
1.8K0
Java 如何从一个 List 中随机获得元素
Java 如何从一个 List 中随机获得元素
从一个 List 中随机获得一个元素是有关 List 的一个基本操作,但是这个操作又没有非常明显的实现。
HoneyMoose
2022/04/29
2K0
Java 如何从一个 List 中随机获得元素
Map映射如何使用迭代器?
迭代器只针对集合类型的数据,因此map类型的必须先转换成集合类型才能使用迭代器去获取元素。
孙晨c
2019/11/21
1.2K0
Mybatis的sql映射文件的顶级元素使用实例(超级详细)
Mybatis是是一款优秀的持久层框架(持久化是程序数据在瞬时状态和持久状态间转换的过程。),在dao层大量使用,使sql语句封装在配置文件中,降低程序的耦合度。
jiankang666
2022/05/12
4130
Mybatis的sql映射文件的顶级元素使用实例(超级详细)
物流巨头顺丰如何布局AI?这是其AI首席科学家的详细解读
随着人工智能的发展,一些物流公司也纷纷尝试利用人工智能技术优化物流环节,提高物流效率。就人工智能将如何改变物流业?物流领域人工的岗位和人工智能之间的关系是什么? 在2018网易经济学家年会“人工智能与人类未来”分论坛上,顺丰人工智能首席科学家刘志欣表示,人工智能技术的发展,实际上是让原有的算法更加高效,而这个算法本身和人工的岗位是共生互补的,它是一个工具,不会取代人的工作。 顺丰AI首席科学家 刘志欣 他认为,物流领域是一个高需求、大流量的方向,这里面本身就会有大量的工作岗位出现。回归人工智能的本质,它
企鹅号小编
2018/02/24
1.3K0
物流巨头顺丰如何布局AI?这是其AI首席科学家的详细解读
seaborn画风和主题风格
本文中的主要知识点: seaborn画风的使用 怎么隐藏刻度线 多个子图怎么使用不同的风格 刻度轴上的数值大小和线条粗细设置 import seaborn as sns # seaborn是对matplotlib的基础上进行了封装 import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib inline ---- 默认画风 def sinplot(flip=1): x = np.l
皮大大
2021/03/02
8810
CSS 布局_3 Position元素定位
我们之前已经介绍过行元素,块元素及行内块元素的属性了,能够知道它们是具有自己默认的显示方式的,即元素会按照文档流 (document flow) 的方式,自上而下,从左到右进行布局,如果你想要改变元素默认的定位行为,就需要设置 position 属性了
Nian糕
2018/08/21
9480
CSS 布局_3 Position元素定位
【CSS布局】Flex布局中元素换行设置间距问题
1. 父元素定高的情况下,直接使用 align-content: space-between;
且陶陶
2023/04/12
5.8K0
【CSS布局】Flex布局中元素换行设置间距问题
Pages 无法使用此AppleID更新
无法更新是因为这个应用并没有绑定到已经登录的AppleID中,点击已购,会提示有应用需要接受,点击全部接受。输入几次密码之后再次更新就ok了、
obaby
2023/02/23
1K0
【CSS 学习笔记】CSS元素和布局
其中 margin 称为外边距,在计算元素整体宽高的时候一般不包括它。CSS3 中新增了一个属性 box-sizing,可以用来指定使用的盒模型计算方式。下面是 CSS3 中支持的盒模型计算方式(CSS2种只支持默认的)
零式的天空
2022/03/22
1.1K0
如何使用Hibernate映射文件将Java类映射到数据库表
上述示例中,<class>元素定义了Employee类和Department类与数据库表的映射关系,<id>元素定义了主键字段的映射,<property>元素定义了普通字段的映射,<many-to-one>元素定义了多对一关系的映射。
堕落飞鸟
2023/05/15
1.2K0
点击加载更多

相似问题

如何获得此布局?

10

如何获得此布局?

40

如何获得此xml android布局

10

使浮动元素在列布局中顺行以满足上面的元素

13

如何在Tkinter中获得此布局?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文