0

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

我构建了允许我创建 GUI 并将短语存储在变量中的代码var。现在我不知道如何进行,因为我无法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()

图形用户界面图像

我应该在类中使用我的算法作为函数吗?还是有其他方法?

谢谢你。

4

1 回答 1

0

当您使用类并且需要跨类中的方法访问某些内容时,您需要通过在变量前面加上self. 因此SavePhrase,您需要创建varself.var好像该类的其他部分需要访问它一样

如果您想在单独的窗口中显示结果,那么我将在其中创建一个新wx.Frame实例SavePhrase并将其传递给您的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/

于 2019-11-14T20:33:52.557 回答