我正在尝试创建一个包含项目列表的轻量级跨平台消息框。理想情况下,它有一个API,允许您传递消息以显示,标题和选择元组。按OK后,它将返回当前选择的选项。最好将所需模块作为标准python发行版的一部分。
Easygui有我正在寻找的名为http://easygui.sourceforge.net/download/version0.95/tutorial/index.html#contents_item_10.1的选择框。然而,它弹出的窗口是怪异的,它总是按字母顺序排序您的选择列表。由于这些“功能”,easygui并不理想。
我也研究了bwidgets,pmw和Tix。在尝试这些时,我遇到了一些问题,包括:难以在不同平台上找到工作示例和失败。
我的工作模型是使用Tkinter的OptionMenu和pickle来返回数据(参见下面的代码示例)。虽然这有效,但是为了避免使用全局变量,将选择保存到文件系统是相当烦人的。 有没有办法在毁灭gui后返回选择?
非常感谢任何帮助/建议。请注意,这些示例仅供参考,它们可能在您的系统上正常运行,也可能无法正常运行。
州管理模块
import pickle
def store(pkl_path, data_to_store):
try:
fid = open(pkl_path, 'w')
pickle.dump(data_to_store, fid)
except:
print 'Unable to store data in ' + pkl_path
else:
fid.close()
def load(pkl_path):
try:
fid = open(pkl_path, 'r')
loaded_state = pickle.load(fid)
fid.close()
except:
loaded_state = None
else:
fid.close()
return loaded_state
菜单模块
from Tkinter import *
def Prompt_Dropdown_Ok_Cancel(title, options, pickle_file, default_selection=0):
master = Tk()
master.title(title)
var = StringVar(master)
var.set(options[default_selection]) # default value
w = OptionMenu(master, var, *options)
w.pack()
def ok():
state.store(pickle_file, var.get())
master.quit()
def cancel():
state.store(pickle_file, None)
master.quit()
button = Button(master, text="OK", command=ok)
button.pack()
b2 = Button(master, text="Cancel", command=cancel)
b2.pack()
mainloop()
使用示例
from menu_module import *
def display_com_selection():
pkl_path = '.tmp/comm_selection'
title = 'COM Port Selection'
Prompt_Dropdown_Ok_Cancel(title,get_available_com(),pkl_path)
selection = state.load(pkl_path)
return selection
修改
无视我对全局变量的关注,我尝试使用它们来实现它是否更容易。它使事情变得更加容易,但我的问题仍然是更好的方法。
以下是重写的菜单模块
from Tkinter import *
Prompt_Dropdown_Ok_Cancel_Selection = None
def Prompt_Dropdown_Ok_Cancel(title, message, options, default_selection=0):
master = Tk()
master.title(title)
var = StringVar(master)
var.set(options[default_selection]) # default value
l = Label(master, text=message)
l.pack()
w = OptionMenu(master, var, *options)
w.pack(fill=BOTH, expand=1)
def ok():
global Prompt_Dropdown_Ok_Cancel_Selection
Prompt_Dropdown_Ok_Cancel_Selection = str(var.get())
master.destroy()
def cancel():
global Prompt_Dropdown_Ok_Cancel_Selection
Prompt_Dropdown_Ok_Cancel_Selection = str(var.get())
master.destroy()
button = Button(master, text="OK", command=ok)
button.pack(side=LEFT)
b2 = Button(master, text="Cancel", command=cancel)
b2.pack(side=LEFT)
mainloop()
return Prompt_Dropdown_Ok_Cancel_Selection
答案 0 :(得分:1)
正常的对话框工作方式如下:
mydialog = SomeDialogClass(...)
result = mydialog.Show()
if result == "OK":
print "you clicked OK; dialog value is", mydialog.GetValue()
else:
print "you clicked cancel"
mydialog.Destroy()
这是伪代码,旨在与GUI工具包无关(尽管它看起来很像wxPython)。主要思想是,您将对话框创建为对象,要求对象显示自己,等待用户完成(通过单击“确定”或“取消”),然后询问对象的数据,最后摧毁物体(或者,保留它以便重复使用)。
执行此操作的第二种方法是编写代码,以便为对话框提供调用函数以设置值。像这样:
mydialog = SomeDialogClass(..., callback=self.foo)
....
def foo(self, button, result):
if button == "OK":
print "you clicked OK; result is", result
elif button == "Cancel":
print "you clicked Cancel"
如果对话框不是模态的,那么第二种方法效果很好(即:当对话框存在时,程序继续运行)。