Tix ComboBox导致python2.7崩溃
我在用Tix创建一个组合框的时候,如果输入框留空,就会偶尔崩溃。
我刚开始学Python,对图形界面编程也很陌生,所以我一直在用例子来教自己。
在使用下面的示例代码时,你应该可以在输入框里输入值,或者从下拉菜单中选择,但如果你把输入框留空然后按“开始”,就会导致Python崩溃。
import Tix
import tkMessageBox
class App(object):
def __init__(self, window):
window.winfo_toplevel().wm_title("test")
self.window = window
self.combo = Tix.ComboBox(window)
self.combo.insert(Tix.END, 'thing1')
self.combo.insert(Tix.END, 'thing2')
self.combo.entry['state'] = "normal"
self.combo['editable'] = True
self.combo.pack()
button = Tix.Button(window)
button['text'] = "Go"
button['command'] = self.go
button.pack()
def go(self):
tkMessageBox.showinfo('info', self.combo['selection'])
if __name__ == '__main__':
root = Tix.Tk()
App(root)
root.mainloop()
========================= 崩溃详情:
Problem signature:
Problem Event Name: APPCRASH
Application Name: python2.7.exe
Application Version: 0.0.0.0
Application Timestamp: 4cfbf049
Fault Module Name: ntdll.dll
Fault Module Version: 6.1.7600.16385
Fault Module Timestamp: 4a5bdb3b
Exception Code: c0000005
Exception Offset: 0002e23e
OS Version: 6.1.7600.2.0.0.256.48
Locale ID: 2057
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
所以
A] 是不是这个例子做错了什么?
B] 有没有更好的方法?
C] 我应该使用Tix吗?
我注意到有些人似乎不太使用Tix,而只用Tkinter。这有什么原因吗?我真的不应该用Tix吗?
++++++++++++++++++++++++++++
好吧,我通过添加value =' '来解决了这个问题,这样返回的字符串就不会是空的,然后在需要的时候用lstrip()去掉空格。
self.combo = Tix.ComboBox(window, value =' ')
...
tkMessageBox.showinfo('info', self.combo['selection'].lstrip())
虽然这个方法很丑,但暂时让我避免崩溃;直到有更聪明的人能给我更好的答案。如果用户删除了空格然后按“开始”,那当然又会崩溃!
1 个回答
1
我不是Tix的专家,但这个方法应该能解决问题:
tkMessageBox.showinfo('info', self.combo.entry.get())
在这里,我建议你使用wxPython来学习图形用户界面(GUI)编程。对我来说,这个环境非常适合学习。
import wx
class MainWin(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.combo = wx.ComboBox(self, choices=["Thing 1", "Thing 2"])
self.button = wx.Button(self, label="Go")
self.button.Bind(wx.EVT_BUTTON, self.OnButton)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.combo, 0, wx.EXPAND)
self.sizer.Add(self.button, 0, wx.EXPAND)
self.SetSizerAndFit(self.sizer)
self.Show()
def OnButton(self, e):
wx.MessageBox(self.combo.GetValue())
app = wx.App(False)
main_win = MainWin(None)
app.MainLoop()