使用 Python/Kivy 构建按钮时如何实现线程以及 Buttonpress 的单独线程

Posted

技术标签:

【中文标题】使用 Python/Kivy 构建按钮时如何实现线程以及 Buttonpress 的单独线程【英文标题】:How to implement Threading when building buttons with Python/Kivy and separate thread for Buttonpress 【发布时间】:2020-11-09 17:39:50 【问题描述】:

在我的课堂上使用 Kivy 构建按钮时如何实现线程 并且在调用 start 时在 buttonpress 上有一个单独的线程:text="START",size_hint=(SizeW, SizeH), pos_hint='x': .0, 'y': ButtonY, on_press=start)

或者,如果您有任何建议可以如何更好地完成或应该如何完成,我真的很感激我真的坚持这一点

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.core.window import Window
from filex import start


class Hello(FloatLayout):
    def __init__(self, **kwargs):
        super(Hello, self).__init__(**kwargs)
        Window.size = (800, 150)
        Window.clearcolor = (0, 0, 1, 1)

        # Main Buttons
        ButtonY = 0.5
        SizeH = 0.5
        SizeW = 0.33

        
        self.walk_button = Button(background_normal='image4.png',
                                  border=(0, 0, 0, 0),
                                  text="START",size_hint=(SizeW, SizeH), pos_hint='x': .0, 'y': ButtonY, on_press=start)
        self.help_button = Button(background_normal='image1.png',
                                  border=(0, 0, 0, 0),
                                  text="Help",  size_hint=(SizeW, SizeH), pos_hint='x': .67, 'y': 0,on_press=self.update)
        self.go_button = Button(background_normal='image2.png',
                                border=(0, 0, 0, 0),
                                text="Go",      size_hint=(SizeW, SizeH), pos_hint='x': .335, 'y': 0)

        self.add_widget(self.help_button)
        self.add_widget(self.go_button)
        self.add_widget(self.walk_button)
        
        self.current_text = "Default"


    def update(self,event):
        self.walk_button.text = "Changed to change"

class Example(App):


    def build(self):
        return Hello()

if __name__ == '__main__':
    x = Example();
    x.run();

【问题讨论】:

我认为您可以通过编写更少量的代码来说明相同的问题来改进您的问题。例如 - 只制作一个按钮,删除与问题无关的代码行。这样可以更轻松地帮助他人,让其他人更容易解决您的问题并在此处找到答案。 【参考方案1】:

你可以通过调用来使用线程:

threading.Thread(target=self.update).start()

当您的按钮启动一个需要很长时间才能运行的方法时,这是一个好主意。 (重要的是您不希望您的 GUI 被阻塞的任何时间长度)。但是,任何修改 GUI 的事情都必须在主线程上完成, 因此,您问题中的 update() 方法不适合在单独的线程中运行。如果您有一个长时间运行的方法也需要修改 GUI,则在单独的线程中运行它,但调用另一个只进行 GUI 修改的方法:

Clock.schedule_once()

【讨论】:

以上是关于使用 Python/Kivy 构建按钮时如何实现线程以及 Buttonpress 的单独线程的主要内容,如果未能解决你的问题,请参考以下文章

我在使用python kivy构建app时遇到错误

Python Kivy:如何在按钮单击时调用函数?

单击python kivy中的按钮后如何打开弹出窗口?

使用 python kivy 构建应用程序时出现错误

使用 Python kivy 创建游戏开始菜单

在 Kivy 应用程序中获取文本输入值