IronPython - WPF应用程序 - 从GUI收集用户输入(在我关闭GUI之后)并在主Python代码

时间:2015-12-15 18:41:51

标签: wpf ironpython

我使用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。如果你能在这个问题上帮助我,我真的很感激。

1 个答案:

答案 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)