python - 当我将组合框选择为特定值时,如何禁用文本ctrl?

标签 python user-interface wxpython

我想实现当我选择ComboBoxanonymous时,TextCtrl变灰的效果。我希望 TextCtrl 对象位于方法 set_name 的本地,我不希望 tc 成为整个类的成员。 也就是说,如何在不将 tc 更改为 self.tc 的情况下实现此目的?如果可能的话,我也不想将 select_user_typeset_name 这两个方法合并为一个。

import wx


class Example(wx.Frame):

    def __init__(self, title):
        super().__init__(None, title=title)
        self.panel = wx.Panel(self)
        self.initUI()

    def initUI(self):
        sizer = wx.GridBagSizer(2, 2)
        self.select_user_type(sizer)
        self.set_name(sizer)
        self.panel.SetSizer(sizer)
        sizer.Fit(self)

    def select_user_type(self, sizer):
        user_type = ['normal', 'anonymous']
        combo = wx.ComboBox(self.panel, choices=user_type)
        sizer.Add(combo, pos=(0, 1), span=(1, 2), flag=wx.TOP|wx.EXPAND, border=5)
        combo.Bind(wx.EVT_COMBOBOX, self.on_user_type)

    def set_name(self, sizer):
        text1 = wx.StaticText(self.panel, label="Enter your name:")
        sizer.Add(text1, pos=(1, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=10)
        tc1 = wx.TextCtrl(self.panel, style=wx.TE_CENTER, value="enter_name_here")
        tc1.Bind(wx.EVT_TEXT, self.on_get_text)
        sizer.Add(tc1, pos=(1, 1), flag=wx.TOP|wx.RIGHT|wx.BOTTOM|wx.EXPAND, border=5)

    def on_get_text(self, e):
        tc = e.GetEventObject()
        print(tc.GetValue())

    def on_user_type(self, e):
        print("how to disable text ctrl when I select anonymous")


if __name__ == '__main__':
    app = wx.App()
    Example("Example").Show()
    app.MainLoop()

最佳答案

如果您不想将引用直接保存在类实例上,您有几个选择

1.在实例之外保存引用,即

import wx

combo_tc_map = {}

class Example(wx.Frame):
    self.panel = wx.Panel(self)
    combobox = wx.ComboBox(self.panel)
    textctrl = wx.TextCtrl(self.panel)
    # references are saved in a module level dict
    combo_tc_map[combobox] = textctrl
    combobox.Bind(wx.EVT_COMBOBOX, self.on_user_type)


    def on_user_type(self, e):
        combo = e.GetEventObject()
        tc = combo_tc_map[combo]
        tc.Disable()

2. 或者,您可以直接在组合框上保存对 textctrl 的引用,即:

import wx


class Example(wx.Frame):
    self.panel = wx.Panel(self)
    combobox = wx.ComboBox(self.panel)
    textctrl = wx.TextCtrl(self.panel)
    # reference is saved directly to the ComboBox
    combobox._linked_textctrl = textctrl
    combobox.Bind(wx.EVT_COMBOBOX, self.on_user_type)

    def on_user_type(self, e):
        combo = e.GetEventObject()
        tc = combo._linked_textctrl
        tc.Disable()

关于python - 当我将组合框选择为特定值时,如何禁用文本ctrl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53817548/

相关文章:

python - Re-factoring To MVC pattern——view与controller分离的疑惑

multithreading - 如何使用wxpython线程来防止阻塞主循环

python - 按行附加 Pandas 数据框

python - numpy - 对数组的每一行应用聚合

c# - 如何使字节值用作 int

Android官方闹钟星期样式

python - Mlabwrap 多处理

python - 忽略 Black 格式化程序的 pyproject.toml 文件中的 Django 迁移

python - 将多个 .ui 文件导入 main.py 文件

python - 如何调整我当前的启动画面以允许我的其他代码片段在后台运行?