gpt4 book ai didi

python - Tkinter OptionMenu 可移植消息框

转载 作者:太空宇宙 更新时间:2023-11-03 19:31:26 25 4
gpt4 key购买 nike

我正在尝试创建一个包含项目列表的轻量级跨平台消息框。理想情况下,它有一个 API,允许您传递要显示的消息、标题和选择元组。当按“确定”时,它将返回当前选择的选项。所需的模块最好是标准 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

最佳答案

对话框的正常工作方式是这样的:

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"

如果您的对话框不是模态的(即:当对话框存在时您的程序继续运行),第二种方法效果很好。

关于python - Tkinter OptionMenu 可移植消息框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5658695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com