如何在主wxPython窗口中创建永久文本输入?

时间:2014-11-22 00:07:10

标签: python wxpython wxwidgets

我是wxPython的新手,我想知道是否可以在主窗口中创建文本输入对话框输入栏?我不想为用户输入创建新的框/窗口,而是希望有一个永久输入字段,就像 resultsInput 类提供PyQt QWidget布局一样。

我发现可以创建Multiple TextEntryDialog windows,但是我们可以在一个窗口上执行此操作吗?

使用TextEntryDialog是否可以,或者我是否需要使用其他类?

这是我到目前为止所拥有的:

import wx

class Window(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'WX Python Window', size=(300, 200))
        panel = wx.Panel(self)

        text_enter = wx.TextEntryDialog(None, "Please enter some text.", "Title", "Default")
        if text_enter.ShowModal() == wx.ID_OK:
            response = text_enter.GetValue()
            wx.StaticText(panel, -1, response, (10, 50))

if __name__=='__main__':
    app = wx.PySimpleApp()
    frame = Window(parent=None, id=-1)
    frame.Show()
app.MainLoop()

提前致谢!

2 个答案:

答案 0 :(得分:0)

  

我想知道是否可以创建文本输入对话框输入栏

你似乎有点困惑。

文本输入栏不是对话框。它只是一个小部件(又名控制) - 特别是TextCtrl

TextEntryDialog包括TextCtrl,标题栏,标题和一些按钮;除了一两个按钮,你不需要任何其他东西。它有一个小组,有一些sizer来解决问题,但你不希望这样;它甚至没有将按钮放在入口栏旁边。它也是一个顶级窗口,你再次不想要它。更重要的是,它有一堆代码就像一个对话框 - 以模态方式接管整个界面,直到用户键入内容并单击一个你绝对不想要的按钮时才返回。

因此,您希望对话框中唯一需要的是TextCtrlButton,可能是Panel Sizer组合在一起的{{1}}所以你可以控制布局。所以,只需创建它们。为按钮添加一个处理程序,该按钮读取文本输入的值并对其执行某些操作,然后就完成了。

(你特别要求的是一种在窗口中放置对话框的方法是不可能的;你可以将顶层窗口嵌入到子窗口中,或者你可以创建一些像对话框一样的东西但是不是顶级的。但这些都不容易,也不是你想要的。)

答案 1 :(得分:0)

这是

import os
FPATH = os.path.expanduser("~/.my_username")
class SavedTextCtrl(wx.TextCtrl):
    def __init__(self,*args,**kw):
        self.save_action = kw.pop("save_action",lambda:open(FPATH,"wb").write(self.GetValue()))
        self.load_action = kw.pop("load_action",lambda:self.SetValue(
                                open(FPATH,"rb").read() if os.path.exists(FPATH) else "")
                            )
        wx.TextCtrl.__init__(self,*args,**kw)
        self.load_action()
        self.Bind(wx.EVT_TEXT,lambda e:self.save_action())


class Window(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'WX Python Window', size=(300, 200))
        sz = wx.BoxSizer(wx.HORIZONTAL)
        sz.Add(wx.StaticText(self,-1,"Name:"))
        self.text_ctrl = SavedTextCtrl(self,-1)
        sz.Add(self.text_ctrl)
        self.SetSizer(sz)
        self.Layout()
        self.Fit()

这可能是你正在寻找的东西