2016-10-29 37 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)