2016-10-29 14 views
1

我正在写一个加热控制系统的代码。更改标签文本acc。到python变量

我只是想能够改变标签文本FROM WITHPYTHON。我的意思是,不是在GUI代码中,而是在主要的其他地方。

这里是我的MWE:

import time 
from kivy.app import App 
from kivy.uix.button import Button 
from kivy.uix.label import Label 
from kivy.uix.widget import Widget 
from kivy.uix.boxlayout import BoxLayout 
import multiprocessing 
from kivy.properties import StringProperty 


class Data (Widget): 
    top = StringProperty('hiii') 
    def __init__(self, **kwargs): 
     super(Widget, self).__init__(**kwargs) 


global mydata  
mydata=Data() 

class myw (BoxLayout): 
    def __init__(self, **kwargs): 
     super(myw, self).__init__(**kwargs) 
     VERT = BoxLayout(orientation='vertical') 
     o = Label(text='Oben: ', 
        font_size=120) 
     m = Label(text='Mitte: ', 
       font_size=120) 
     u = Label(text='Unten: ', 
       font_size=120) 
     a = Label(text='Aussen: ', 
       font_size=120) 

     mydata.bind(top=o.setter('text')) 

     VERT.add_widget(o) 
     VERT.add_widget(m) 
     VERT.add_widget(u) 
     VERT.add_widget(a) 

     onoff = Button(text='Ein', 
       font_size=120, 
       size_hint=(0.3, 1)) 
     self.add_widget(VERT) 
     self.add_widget(onoff) 



class TutorialApp(App): 
    def build(self): 
     return myw() 

if __name__ == "__main__": 
    try: 
     global myapp 
     myapp=TutorialApp() 
     app_runner=multiprocessing.Process(target=myapp.run) 
     app_runner.start() 
     time.sleep(3) 
     mydata.top='new value assigned' 
     print (mydata.top) 
     time.sleep(5) 
     app_runner.terminate() 
    except Exception as e: 
     print ('error occured', e) 

我特意宣布kivy码外的变量“MYDATA”,这样我可以从其他地方在代码中(这里没有显示)访问它。

+0

我知道了!但是这对我来说不起作用... – eric

+0

它工作得很好。我现在唯一看到的是'string ='now changed'',它与'RootWidget.string'不同。得到这个变量使用'my_app.root.string ='something''。它应该改变。然而,你的代码给了我一个'RuntimeError'和一些关于'freeze_support'所以... – KeyWeeUsr

+0

是的,我得到一个错误的方法,以及...我编辑了第二次尝试的原始代码... – eric

回答

1

使用线程代替多处理解决了这个问题。

所以不是

app_runner=multiprocessing.Process(target=myapp.run) 

它现在读取:

app_runner=threading.Thread(target=myapp.run)