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

为什么函数不运行?
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

复制
相关文章
CSS中如何解决子元素继承父元素的opacity属性?
这里有两个方案,使用rgba()间接的设定opacity的值,这个属性不会向下继承,或者既然opacity会被子级元素继承,那就把opacity属性放到同级元素实现,下面通过示例具体说说这两种方式:
全栈程序员站长
2022/09/01
4.5K0
CSS3中如何解决子元素继承父元素的opacity属性[通俗易懂]
css3中的opacity属性是用来设置 div 元素的不透明级别的,但是我们往往会遇到因为父级元素设定opacity后,子元素也跟着透明了,但是有时候我们只是想让背景是透明的,这该如何解决呢?
全栈程序员站长
2022/09/01
4K0
CSS3中如何解决子元素继承父元素的opacity属性[通俗易懂]
父元素opacity属性对子元素的影响(子元素设置opacity无效)
这段时间做了一个项目优化,对于原有的内容进行了重新设计实现,其中一项就是对于label标签添加hover层进行解释说明,最常用的办法及时label的容器设置relative,然后hover层作为它的子元素设置absolute,然后在使用label的hover伪类来控制hover层的显示和隐藏,这其中一个要求及时hover层必定要求能够遮住页面中其他的元素,所以最常用的办法是设置它的背景颜色,然后让它的z-index处于合理的位置,一切都是这样设计的,但是最终的效果却出现了hover层设置bg为#fff的时候,hover层显示时还是会把底部内容给透出来,第一反应就是opacity设置为1,但是还是没有效果(因为背景为白色,所以有点坑)
全栈程序员站长
2022/09/01
3.2K0
父元素opacity属性对子元素的影响(子元素设置opacity无效)
【CSS】浮动 ⑥ ( 浮动元素与父容器盒子关系 | 代码示例 )
在 父容器 盒子模型 中 , 将 子元素 设置为 浮动元素 , 会出现如下情况 :
韩曙亮
2023/03/27
8050
【CSS】浮动 ⑥ ( 浮动元素与父容器盒子关系 | 代码示例 )
原生JS如何获取当前元素属于父元素第几个子元素
原生JS有一个常见的小技巧那就是通过元素的previousSibling 属性,额外需要注意的是该属性会遍历text节点,即回车键。
IT工作者
2022/01/26
10.4K0
子元素滚动,父元素不滚动
这个是为了处理在bootstrap框架中的iframe 滚动条的问题,查找到的解决方案
solate
2019/07/22
4.1K0
vue获取当前点击元素的父元素、子元素、上级元素等
<div @click = "clickfun($event)">点击</div> methods: { clickfun(e) { // e.target 是你当前点击的元素 // e.currentTarget 是你绑定事件的元素 #获得点击元素的前一个元素 e.currentTarget.previousElementSibling.innerHTML #获得点击元素的第一个子元素 e.curre
用户1349575
2022/01/26
11.3K0
Js如何修改元素的属性值
http://mpvideo.qpic.cn/0bc3eaajwaaa4qaelx3bjvrvaigdtmqabgya.f10002.mp4?dis_k=4cf17def14cb58de5ca3ebc
itclanCoder
2022/12/07
13.5K0
如何修改伪元素的content属性的值
前面一篇文章我们了解如何用js控制伪元素的样式,接下来我们看看如何修改伪元素的content属性,因为伪元素并不存在在dom中,所以我们只能通过修改样式表的方式来修改content内容,除了修改样式表还有另外一种方式。
挥刀北上
2021/01/27
6.1K0
如何修改伪元素的content属性的值
js/jquery获取父窗口元素
做WEB前端开发的过程中,经常会有这样的需求,用户点击【编辑】按钮,弹出一个对话框,在里边修改相应的值,然后把修改后的值显示在原页面,最后点击保存。用window.parent.document.getElementById().setAttribute("value","")可以很好的解决这个问题。
Jensen_97
2023/07/19
7510
子元素margin-top导致父元素移动的问题
今天在修改页面样式的时候,遇到子元素设置margin-top 但是并没有使得子元素与父元素之间产生间隔,而是作用在了其父元素上,导致父元素产生了一个margin-top 的效果。
Daotin
2021/01/30
2.8K0
[python]父类、子类、子类实例属性
本文旨在说明 父类、子类、子类实例的属性继承关系: >>> A = type('A', (), {'name':1}) >>> B = type('B',(A,), {'addr':'beijing'})    #B的父类为A >>> A.__dict__ mappingproxy({'name': 1, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute
py3study
2020/01/19
1.9K0
子元素margin-top转移到父元素
如果子元素设置了margin-top/bottom,且父元素没有触发hasLayout,那么子元素的margin就可能转移到父元素。具体表现如下图(父元素虽然设置了background,但并不能覆盖子元素的margin部分;不过父元素高度足够时可以覆盖margin-bottom):
gojam
2019/09/19
1.1K0
子元素margin-top转移到父元素
css 子元素margin-top影响了父元素
可以看到box1虽然没有margin-top:50px,但是上方也留出了50px
路过君
2020/11/12
1.6K0
css 子元素margin-top影响了父元素
经典布局:如何定义子控件在父容器中的排版位置?
在之前的文章中,我们一起学习了构建视图的基本元素,文本Text、图片Image和按钮,用于展示一组连续视图元素的ListView,以及处理多重嵌套的可滚动视图的CustomScrollView,等等。
拉维
2019/08/12
4.7K0
经典布局:如何定义子控件在父容器中的排版位置?
Java 获取对象全部属性 包括 父类属性
异常信息 ​ 程序会告诉你无法这么转换,所以这里要注意 ​ 第二种的参数就填你要转换的数组就可以,但是他要求数组的长度是等于链表的长度的,否则会编译不通过,所以得到链表之后在初始化数组即可
庞小明
2019/07/28
2.7K0
在未知大小的父元素中设置居中
当提到在web设计中居中元素时。关于被居中的元素和它父元素的信息,你知道的越多就越容易设置。那么假如当你不知道任何信息?居中也是可设置的。
lesM10
2019/08/26
4.1K0
在未知大小的父元素中设置居中
获取元素的样式属性 原
document.getElementById("test").style.color 这种方式获取的只是内联样式,并不能获取内部样式和外部样式,下面为内部样式
tianyawhl
2019/04/04
2.4K0
XML元素和属性
默认情况下,next()方法不检查是否存在与标记为必需的属性相对应的元素和属性。要使读取器检查此类元素和属性是否存在,请在调用Next()之前将读取器的CheckRequired属性设置为1。出于兼容性原因,此属性的默认值为0。
用户7741497
2022/07/04
1.4K0
点击加载更多

相似问题

如何使用jQuery检索容器父容器的URL?

22

用AngularJS获取父容器的DOM元素属性

17

检索单击元素的父元素

21

检索元素父索引

10

如何检索元素的属性?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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