打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Kivy和Python线程-如何在它们之间获取数据

我在python(threading)和kivy上遇到一些问题:

这是一些代码:

import kivyimport threading import timefrom kivy.app import Appfrom kivy.uix.button import Buttonclass Thread(threading.Thread):    def __init__(self):        threading.Thread.__init__(self)          self.counter = 0            def run(self):        while True:            print "Thread is running " str(self.counter)            app.button.text = self.set_button(self.counter)            app.button.text = str(self.counter)            time.sleep(0.5)    def count(self):        self.counter  = 1        app.button.text = str(self.counter)         def set_button(self, value):        app.button.text = str(value)class MyApp(App):    def __init__ (self, thread_object):        App.__init__(self)         self.thread_object = thread_object          def callback(self,instance):        print('The button <%s> is being pressed' % instance.text)        self.thread_object.count()    def build(self):        self.button = Button(text='Hello World')        self.button.bind(on_press=self.callback)        return self.buttonthread = Thread()thread.start()app = MyApp(thread)app.run()

现在-此代码只需一个按钮即可打开kivy应用程序.任务是:按下按钮,一些数据应显示在线程代码中(通过“ count”方法执行).

问题是相反的-线程代码应更改按钮的文本.我尝试了两种方法:

>直接编写:app.button.text = str(self.counter)
>通过“ set_button”方法编写:app.button.text = self.set_button(self.counter)

它们都显示错误“属性错误:’MyApp’对象没有属性’按钮’”.

有没有任何方法可以直接交换数据而无需请求,即使不使用“ thread_object”在此处进行指针操作

def __init__ (self, thread_object):

谢谢你的帮助.

解决方法:

这可能会解决您的所有问题.那就是我喜欢在处理线程和奇异语言时进行编码的方式.

这是thread.py文件

import threading   from kivy.app import Appfrom kivy.uix.boxlayout import BoxLayoutfrom kivy.properties import NumericPropertyclass Thread(BoxLayout):    counter = NumericProperty(0)    def Counter_function(self):        self.counter  = 1        self.ids.lbl.text = "{}".format(self.counter)    def First_thread(self):        threading.Thread(target = self.Counter_function).start()        self.counter  = 1        self.ids.lbl.text = "{}".format(self.counter)class MyApp(App):    def build(self):        self.load_kv('thread.kv')        return Thread() if __name__ == "__main__":    app = MyApp()    app.run()

这是thread.kv文件

<Thread>:    Button:        text: "use thread"        on_release: root.First_thread()    Button:        text: "Hit me"        on_release: root.Counter_function()    Label:        id: lbl        text: "Numbers"

现在,您在评论中说,您在动态加载GUI方面遇到困难.所以,这是一个例子.

Builder.load_string('''[SideBar@BoxLayout]:    content: content    orientation: 'vertical'    size_hint: .2,1    BoxLayout:        orientation: 'vertical'        # just add a id that can be accessed later on        id: content<Root>:    Button:        center_x: root.center_x        text: 'press to add_widgets'        size_hint: .2, .2        on_press:            sb.content.clear_widgets()            root.load_content(sb.content)    SideBar:        id: sb''')class Root(BoxLayout):    def load_content(self, content):        for but in range(20):            content.add_widget(Button(text=str(but)))class MyApp(App):    def build(self):        return Root()
来源:https://www.icode9.com/content-1-567301.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
不会Python GUI?这些框架可太友好了
Python:使用threading模块实现多线程编程
python爬虫14 | 就这么说吧,如果你不懂python多线程和线程池,那就去河边摸鱼!
Python 多线程
Python爬虫(四)
Python并发编程:多线程技术详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服