如何将输入(TextCtrl)存储到变量中,通过一些代码行进行处理,并在wxPython的另一个窗口中显示输出



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

我构建了允许我创建GUI并将短语存储在变量var中的代码。现在我不知道如何继续,因为我不能在类外访问var。这里的代码和图形用户界面的图像:

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图像

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

谢谢。

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

如果你想在一个单独的窗口中显示结果,那么我会在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/

相关内容

  • 没有找到相关文章

最新更新