wxwidgets - 框架/面板中的 wxPython 验证器不起作用
问题描述
我对 python 和 wx 很陌生,我正在制作一个应用程序,并且我在 wxPython 槽框架和面板上制作了一些表格和东西。现在我想验证字段,所以我必须验证 TextCtrl,但我遇到了很多麻烦。
我已经阅读了很多关于此的内容,但对我没有任何作用,所有验证器似乎都设计为与 wx.Dialogs 一起使用,但不适用于框架或面板。
在 wx 文档中,我找到了以下语句,但我不知道如何应用。互联网上没有教程或有帮助的东西,所以我很沮丧,任何帮助将不胜感激!
""如果您使用的是窗口或面板而不是对话框,则需要在显示窗口之前显式调用 wx.Window.InitDialog。"" https://wxpython.org/Phoenix/docs/html/validator_overview.html
我已经改编了用对话框制作的最相似的验证器示例,我已经适应了框架,但它不起作用。
import wx
###############################################################################
class CustomNumValidator(wx.Validator):
""" Validator for entering custom low and high limits """
print('creado')
def __init__(self):
super(CustomNumValidator, self).__init__()
# --------------------------------------------------------------------------
def Clone(self):
""" """
return CustomNumValidator()
# --------------------------------------------------------------------------
def Validate(self, win):
""" """
textCtrl = self.GetWindow()
text = textCtrl.GetValue()
print('pasando')
if text.isdigit():
return True
else:
wx.MessageBox("Please enter numbers only", "Invalid Input",
wx.OK | wx.ICON_ERROR)
return False
# --------------------------------------------------------------------------
def TransferToWindow(self):
return True
# --------------------------------------------------------------------------
def TransferFromWindow(self):
return True
class CustomNumbers(wx.Frame):
""" Dialog for choosing custom numbers """
def __init__(self, *args, **kwargs):
super(CustomNumbers, self).__init__(*args, **kwargs)
wx.Frame.__init__(self, None, wx.ID_ANY, "Software Legal")
self.SetBackgroundColour("WHITE")
self.widget_dict = {}
self.initUI()
self.SetSizerAndFit(self.main_sizer)
self.Layout()
self.Refresh()
# --------------------------------------------------------------------------
def initUI(self):
""" """
self.createSizer()
self.createText()
self.createInputBox()
self.createButton()
self.addSizerContent()
# --------------------------------------------------------------------------
def createSizer(self):
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
# --------------------------------------------------------------------------
def createText(self):
""" """
low_num_text = wx.StaticText(self, -1, "Low Number")
high_num_text = wx.StaticText(self, -1, "High Number")
self.widget_dict["low_num_text"] = low_num_text
self.widget_dict["high_num_text"] = high_num_text
# --------------------------------------------------------------------------
def createInputBox(self):
""" """
low_input = wx.TextCtrl(self, validator=CustomNumValidator())
high_input = wx.TextCtrl(self, validator=CustomNumValidator())
self.widget_dict["low_input"] = low_input
self.widget_dict["high_input"] = high_input
# --------------------------------------------------------------------------
def createButton(self):
""" """
ok_btn = wx.Button(self, wx.ID_OK, "Enter")
cancel_btn = wx.Button(self, wx.ID_CANCEL, "Cancel")
self.widget_dict["ok_btn"] = ok_btn
self.widget_dict["cancel_btn"] = cancel_btn
# --------------------------------------------------------------------------
def addSizerContent(self):
""" """
top_sizer = wx.BoxSizer()
top_sizer.Add(self.widget_dict["low_num_text"], 3, wx.ALL, 10)
top_sizer.Add(self.widget_dict["low_input"], 7, wx.ALL ^ wx.RIGHT, 10)
btm_sizer = wx.BoxSizer()
btm_sizer.Add(self.widget_dict["high_num_text"], 3, wx.ALL, 10)
btm_sizer.Add(self.widget_dict["high_input"], 7, wx.ALL, 10)
btn_sizer = wx.BoxSizer()
btn_sizer.Add(self.widget_dict["ok_btn"], 0, wx.CENTER | wx.ALL, 10)
btn_sizer.Add(self.widget_dict["cancel_btn"], 0,
wx.CENTER | wx.ALL, 10)
self.main_sizer.Add(top_sizer)
self.main_sizer.Add(btm_sizer)
self.main_sizer.Add(btn_sizer, 0, wx.CENTER | wx.ALL, 10)
# --------------------------------------------------------------------------
def getValues(self):
""" """
###############################################################################
class MyApp(wx.App):
def OnInit(self):
self.frame= CustomNumbers()
self.frame.Show()
return True
# Run the program
app=MyApp()
app.MainLoop()
del app
原始工作代码是这样的:http: //www.pygopar.com/using-validators-from-wxpython
解决方案
验证器由 的默认实现使用TransferDataToWindow()
,Validate()
以及TransferDataFromWindow()
在显示对话框和关闭对话框时为模态对话框自动调用的函数。您仍然可以在其他类型的窗口中使用验证器,但在这种情况下您需要自己调用这些函数。对于前者,在构建完框架后自己调用它很容易,但你也可以调用InitDialog()
which 会间接为你做这件事(我真的不明白你为什么要这样做)。对于后两者,您需要在用户“接受”选择时手动调用它们,例如通常在单击某个按钮时,这里的逻辑是先调用Validate()
,然后,如果它返回true
,调用TransferDataFromWindow()
将用户输入的数据实际存储在程序变量中。
当然,如果您不需要传输任何东西(在您的示例中没有这样做),您可以调用Validate()
并忘记其他 2 个函数。
推荐阅读
- html - React.js 中的图像和文本滑块响应问题
- machine-learning - 为什么具有低维潜在空间的变分自动编码器是更好的生成模型?
- google-bigquery - bigquery 中设置 search_path 的等效语句是什么?
- powershell - 运行命令时自定义powershell背景颜色会恢复吗?
- mdx - Mdx 中的百分比汇总
- javascript - 下载所有数据,在本地过滤或仅下载过滤后的数据
- javascript - 为什么代码中的 catch 语句没有捕获异步函数中的错误?
- c# - 我可以使用哪些方法来处理球上的软体物理
- html - 小屏幕上的引导隐藏不起作用?
- python-3.x - 如何在训练 CNN 时为 nn.Linear 层选择参数?