背景 作爲python的新手以及GUI編程,我想創建一個基於wxpython的GUI應用程序。此GUI將運行一系列測試用文本文件編寫的測試將會運行,並且它的步驟應顯示在窗口中。爲了選擇一個特定的測試,點擊該特定測試的複選框(下圖中的CheckListCtrl)。測試的結果將在MulilineTextCtrl_2Log在wxpython中的面板安排
顯示的窗口應該是這樣的:
我的ASCII藝術不是那麼好,但是反正
|-------------------------------------------------------------|
|WINDOW TITLExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_[]X|
|xxx[SelectAll]xxxxxx[DeselectAll]xxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|[CheckListCtrl] [MultilineTexTCtrl_1]xxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx[Refresh]xxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx[Execute]xxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxx[MulilineTextCtrl_2Log]xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|_____________________________________________________________|
我曾經有過創造了boxsizers麻煩這個窗口。我有麻煩可視化面板
TestList = [('Test1', 'Test1Description1', 'base'), ('Test2', 'Test1Description1', 'base'),'Test3', 'Test1Description3', 'base'),]
class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):
def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER)
CheckListCtrlMixin.__init__(self)
ListCtrlAutoWidthMixin.__init__(self)
class MainGUI(wx.frame):
panel = wx.Panel(self, -1)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox = wx.BoxSizer(wx.HORIZONTAL)
#topPanel = wx.Panel(panel,-1)
topPanel = wx.Panel(panel, -1,pos=(0,0))
bottomPanel = wx.Panel(panel, -1,pos=(1,0))
self.log = wx.TextCtrl(bottomPanel, -1, style=wx.TE_MULTILINE)
self.list = CheckListCtrl(bottomPanel)
self.list.InsertColumn(0, 'TestID', width=140)
self.list.InsertColumn(1, 'TestDescription')
for i in TestList:
index = self.list.InsertStringItem(sys.maxint, i[0])
self.list.SetStringItem(index, 1, i[1])
self.list.SetStringItem(index, 2, i[2])
vbox2 = wx.BoxSizer(wx.VERTICAL)
sel = wx.Button(topPanel, -1, 'Select All', size=(100, -1))
des = wx.Button(topPanel, -1, 'Deselect All', size=(100, -1))
refresh = wx.Button(bottomPanel, -1, 'Refresh', size=(100, -1))
apply = wx.Button(bottomPanel, -1, 'Execute', size=(100, -1))
self.Bind(wx.EVT_BUTTON, self.OnSelectAll, id=sel.GetId())
self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, id=des.GetId())
self.Bind(wx.EVT_BUTTON, self.OnRefresh, id=refresh.GetId())
self.Bind(wx.EVT_BUTTON, self.OnExecute, id=apply.GetId())
vbox2.Add(sel, 0, wx.TOP, 5)
vbox2.Add(des)
vbox2.Add(apply,wx.RIGHT)
vbox2.Add(refresh)
topPanel.SetSizer(vbox2)
vbox.Add(self.list, 1, wx.EXPAND, 3)
vbox.Add((-1, 10))
vbox.Add(self.log, 0.5, wx.EXPAND)
vbox.Add((-1, 10))
bottomPanel.SetSizer(vbox)
hbox.Add(bottomPanel, 0, wx.EXPAND | wx.RIGHT, 5)
panel.SetSizer(hbox)
self.Centre()
self.Show(True)
def OnSelectAll(self, event):
num = self.list.GetItemCount()
for i in range(num):
self.list.CheckItem(i)
def OnDeselectAll(self, event):
num = self.list.GetItemCount()
for i in range(num):
self.list.CheckItem(i, False)
def OnRefresh(self, event):
num = self.list.GetItemCount()
for i in range(num):
if i == 0: self.log.Clear()
if self.list.IsChecked(i):
self.log.AppendText(self.list.GetItemText(i) + '\n')
def OnExecute(self, event):
num = self.list.GetItemCount()
for i in range(num):
if i == 0: self.log.Clear()
if self.list.IsChecked(i):
self.log.AppendText(self.list.GetItemText(i) + '\n')
app = wx.App()
MainGUI(None, -1, 'Tester')
app.MainLoop()
謝謝@jaoquin縮進問題是由於複製粘貼錯誤。我故意遺漏了一些東西來使代碼更小。 – user974168
@ user974168然後最好消除'self.Bind'或者循環來填充TestList,以便維護代碼的功能以及所需的所有Widget插槽。答案有幫助嗎?否則,如果您提供了更精確的設計(例如,您給出的設計與設計中的小部件名稱和代碼之間沒有關係,則清單控件無法適用一個單行插槽,並不清楚TextCtrl是單行還是多行,在這最後一種情況下,它將垂直延伸多少 – joaquin
@jaoquin我已更新問題 – user974168