我在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
联系客服