我使用XAML开发了一个带有GUI的IronPython-wpf应用程序。用户输入GUI中的所有输入,我可以保存它们。我的问题是如何在USER关闭GUI后将这些变量传递给我的主python代码?要关闭GUI,我有一个关闭GUI的按钮,如果用户点击它。
我所做的如下(我只是复制了部分代码):
import wpf
class MyApp(Window):
def __init__(self):
self.opencfgfile()
self.ictemp = self.FindName('pipent')
self.ictemp.Text = self.ictest
self.button = self.FindName('button')
self.button.Click += self.onClick
def onClick(self, sender, event):
self.Close()
def opencfgfile(self):
sstest = os.environ['test']
infile = open (sstest + '\config\test_Config.cfg' , 'r')
for line in infile:
if line != "\n":
line = line[:-1]
fields = line.split('=')
if fields[0] == 'Initial test ID ':
self.ictest = fields[1].lstrip()
def getsetname(self):
try:
return self.ictemp
except AttributeError:
return
if __name__ == "__main__":
c = MyApp()
Application().Run(c)
iset = c.getsetname()
在我的课堂上,如果我设一个断点,self.ictest的值为'test',self.ictemp的值为{System.Windows.Controls.TextBox:test}
,但是如果我把断点放在我的主程序中iset,我将得到这个值:'当前上下文中不存在名称iset
。如果你能在这个问题上帮助我,我真的很感激。
答案 0 :(得分:0)
您的问题是,只有在主窗口关闭后才会到达代码iset = c.getsetname()
。原因是,Application().Run()
包含您的"应用程序主循环",它将一直运行直到主窗口关闭。因此,在您的情况下,您应该在MyApp
中实现所有交互逻辑,而不是在应用程序入口点。 if __name__ == "__main__"
下的所有内容都只能用于初始化某些模块或类似内容。
如果要封装某些逻辑,请将其放在自己的模块中并从MyApp
调用它。例如,如果您想对某些按钮点击做出反应,请执行以下操作:
# Short
def __init__(self, ...):
# Init component
self.yourButton.Click += self.OnButtonClick
def OnButtonClick(self, sender, args):
MessageBox.Show("Clicked on some button!") # Import Message box before :)
希望这有帮助。
修改强>
这很好用:
import wpf
from System.Windows import Window, Application
from System.Windows.Controls import TextBox
class MyApp(Window):
box = None
def __init__(self):
self.Width = 200
self.Height = 200
self.box = TextBox()
self.box.Height = 24
self.box.Width = 150
self.Content = self.box
def getBoxContent(self):
return self.box.Text
if __name__ == "__main__":
c = MyApp()
Application().Run(c)
print (c.getBoxContent())
信息传递
如果要在ui之间传递信息,只需创建一个包含信息的类。这将是最好的解决方案:
import wpf
from System.Windows import Window, Application
from System.Windows.Controls import TextBox
class Information:
InformationOne = 1
InformationTwo = "Hello World"
class MyApp(Window):
box = None
information = None
def __init__(self, info):
self.information = info
self.Width = 200
self.Height = 200
self.box = TextBox()
self.box.Height = 24
self.box.Width = 150
# Init information
self.box.Text = self.information.InformationTwo
self.Content = self.box
# Information property
@property
def Information(self):
self.information.InformationTwo = self.box.Text
return self.information
if __name__ == "__main__":
info = Information()
c = MyApp(info)
Application().Run(c)
# Get information
print (c.Information.InformationTwo)