【发布时间】:2017-03-12 10:39:26
【问题描述】:
我正在为加热控制系统编写代码。
我只是希望能够从 Python 内部更改标签文本。 我的意思是,不在 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”,这样我就可以从代码中的其他地方访问它(此处未显示)。
【问题讨论】:
-
我知道!但这对我不起作用......
-
它工作得很好。我现在唯一看到的是
string='now changed',它与RootWidget.string不同。要获取该变量,请使用my_app.root.string = 'something'。它应该改变。但是,您的代码只给了我一个RuntimeError和一些关于freeze_support所以... -
是的,我也遇到了这种方法的错误...我再次尝试编辑了原始代码...
-
我的意思是,绑定工作正常。如果操作正确,您可以在更改绑定变量时检查检查器模块。 MP是不错的工具,但我认为它不会这样。以这种方式更改变量对我来说似乎很奇怪。 MP 不允许您通过它获取对象或值,除非您将某些东西设为全局并锁定。 endless 循环 (App.run()) 中的锁定将没有机会更改它。如果您的尝试是让两个 独立 应用程序使用 OSC。如果有两个窗口,检查Philip's article。
-
我只希望一个应用程序在另一个进程中运行。从主要我想更改标签,如上面用
mydata.top='new value assigned'模拟的那样。我不知道是什么让全球。我在上面的代码中将数据和日期实例设为全局,但 mydata 中的更改仍然不会传播到正在运行的应用程序中。 (见上面的编辑代码)
标签: python properties kivy