如何将输入 (TextCtrl) 存储到变量中,通过一些 code-lines 处理它并在 wxPython 中的另一个 window 中显示输出?

How to store an input (TextCtrl) into a variable, process it through some code-lines and show the outputs in another window in wxPython?

我构建了一个脚本,根据给定的报价(输入)通过针对性(输出)查找一本书。现在我想创建这个脚本的 GUI,我决定使用 wxPython。我想要一个基本的 GUI,用户可以在文本栏中写下短语,然后按下一个按钮,将他输入的字符串存储在一个变量中。通过这种方式,我可以使用该变量作为算法的输入来查找与输入的短语相关联的书籍,在第二个 window.

中将标题和作者显示为输出

我构建了允许我创建 GUI 并将短语存储在变量 var 中的代码。现在我不知道如何进行,因为我无法在 class 之外访问 var。这里是 GUI 的代码和图像:

class MyFrame(wx.Frame):    
    def __init__(self, *args, **kw):
        super(MyFrame, self).__init__(*args, **kw)
        panel = wx.Panel(self)
        my_sizer = wx.BoxSizer(wx.VERTICAL)

        my_sizer.AddStretchSpacer()

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        manual = wx.StaticText(panel, label='1) Inserisci la citazione --> ')
        font_manual = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual.SetFont(font_manual)
        hbox.Add(manual)
        manual2 = wx.StaticText(panel, label='2) Clicca sul logo Bibliovago --> ')
        font_manual2 = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual2.SetFont(font_manual2)
        hbox.Add(manual2)
        manual3 = wx.StaticText(panel, label='3) Buona lettura')
        font_manual3 = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual3.SetFont(font_manual3)
        hbox.Add(manual3)
        my_sizer.Add(hbox,0, wx.ALIGN_CENTER)

        my_sizer.AddStretchSpacer()

        istr = wx.StaticText(panel, label='Inserisci una citazione')
        font_istr = wx.Font(14, wx.MODERN, wx.NORMAL, wx.NORMAL)
        istr.SetFont(font_istr)
        my_sizer.Add(istr, 0, wx.ALL | wx.CENTER, 5)

        self.text_ctrl = wx.TextCtrl(panel)
        my_sizer.Add(self.text_ctrl, 0, wx.ALL | wx.EXPAND, 5)        

        logo_button = wx.Bitmap('LOGO.png')
        self.my_btn = wx.BitmapButton(panel,-1,logo_button)
        self.Bind(wx.EVT_BUTTON, self.SavePhrase, self.my_btn)
        my_sizer.Add(self.my_btn, 0, wx.ALL | wx.CENTER, 5) 


        panel.SetSizer(my_sizer)

        my_sizer.AddStretchSpacer()

    def SavePhrase(self, event):
        var = self.text_ctrl.GetValue()       

if __name__ == '__main__':
    app = wx.App()
    frm = MyFrame(None, title='BiblioZam', size = (600,400))
    frm.Show()
    app.MainLoop()

GUI image

我应该在 class 中使用我的算法作为函数吗?还是有别的办法?

谢谢。

当您使用 classes 并且需要在 class 中跨方法访问某些内容时,您需要通过在变量前面添加 self 来创建变量。因此在 SavePhrase 中,如果 class 的其他部分需要访问它

,则需要将 var 创建为 self.var

如果您想在单独的 window 中显示结果,那么我会在 SavePhrase 中创建一个新的 wx.Frame 实例并将其传递给您的 var。那么你不需要调用它 self.var 除非 MyFrame 中的其他东西本身需要访问 var.

这是一个例子:

import wx

class OtherFrame(wx.Frame):
    """
    Class used for creating frames other than the main one
    """

    def __init__(self, var, title='Other Frame', parent=None):
        wx.Frame.__init__(self, parent=parent, title=title)
        self.var = var
        print('var = {}'.format(var))
        self.Show()


class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(MyFrame, self).__init__(*args, **kw)
        panel = wx.Panel(self)
        my_sizer = wx.BoxSizer(wx.VERTICAL)

        my_sizer.AddStretchSpacer()

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        manual = wx.StaticText(panel, label='1) Inserisci la citazione --> ')
        font_manual = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual.SetFont(font_manual)
        hbox.Add(manual)
        manual2 = wx.StaticText(panel, label='2) Clicca sul logo Bibliovago --> ')
        font_manual2 = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual2.SetFont(font_manual2)
        hbox.Add(manual2)
        manual3 = wx.StaticText(panel, label='3) Buona lettura')
        font_manual3 = wx.Font(10, wx.SCRIPT, wx.NORMAL, wx.NORMAL)
        manual3.SetFont(font_manual3)
        hbox.Add(manual3)
        my_sizer.Add(hbox,0, wx.ALIGN_CENTER)

        my_sizer.AddStretchSpacer()

        istr = wx.StaticText(panel, label='Inserisci una citazione')
        font_istr = wx.Font(14, wx.MODERN, wx.NORMAL, wx.NORMAL)
        istr.SetFont(font_istr)
        my_sizer.Add(istr, 0, wx.ALL | wx.CENTER, 5)

        self.text_ctrl = wx.TextCtrl(panel)
        my_sizer.Add(self.text_ctrl, 0, wx.ALL | wx.EXPAND, 5)

        logo_button = wx.Bitmap('LOGO.png')
        self.my_btn = wx.BitmapButton(panel,-1,logo_button)
        self.Bind(wx.EVT_BUTTON, self.SavePhrase, self.my_btn)
        my_sizer.Add(self.my_btn, 0, wx.ALL | wx.CENTER, 5)


        panel.SetSizer(my_sizer)

        my_sizer.AddStretchSpacer()

    def SavePhrase(self, event):
        var = self.text_ctrl.GetValue()
        frame = OtherFrame(var=var)


if __name__ == '__main__':
    app = wx.App()
    frm = MyFrame(None, title='BiblioZam', size = (600,400))
    frm.Show()
    app.MainLoop()

现在您的其他框架可以根据需要使用var来生成结果。请注意,如果生成结果需要很长时间,您可能希望将该生成步骤移到一个线程中,这样它就不会阻塞 GUI 的主循环并导致它看起来挂起。

您可能还会发现我的这篇文章很有帮助 - http://www.blog.pythonlibrary.org/2018/10/19/wxpython-how-to-open-a-second-window-frame/