繁体   English   中英

Tkinter OptionMenu便携式消息框

[英]Tkinter OptionMenu Portable Message Box

我试图创建一个包含项目列表的轻型跨平台消息框。 理想情况下,它具有一个API,可让您传递要显示的消息,标题和选择的元组。 按确定时,它将返回当前选择的选项。 最好将所需模块作为标准python发行版的一部分。

我在Easyeasy中找到名为选择框的内容,该选择框位于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"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM