Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在使用Pyinstaller转换后记住Tkinter条目中的输入历史?_Python_Python 3.x_Tkinter_Pyinstaller - Fatal编程技术网

Python 如何在使用Pyinstaller转换后记住Tkinter条目中的输入历史?

Python 如何在使用Pyinstaller转换后记住Tkinter条目中的输入历史?,python,python-3.x,tkinter,pyinstaller,Python,Python 3.x,Tkinter,Pyinstaller,我正在使用Tkinter构建一个GUI应用程序,然后使用pyinstaller--onefile 我要求输入文本框记住以前的输入历史记录。因此,当用户单击输入框时,is显示以前输入的值,然后用户可以选择其中一个值 请注意,这应该发生在一个exe文件中,即使在关闭后,它也会记住历史记录 我已经考虑过在启动应用程序时创建一个文本文件,它可以存储输入历史记录。并在关闭应用程序后保留文本文件,然后在重新打开应用程序时检查该文件。这是可行的但是,当单击输入框,然后选择一个历史输入时,如何显示输入历史?好的

我正在使用Tkinter构建一个GUI应用程序,然后使用pyinstaller
--onefile

我要求输入文本框记住以前的输入历史记录。因此,当用户单击输入框时,is显示以前输入的值,然后用户可以选择其中一个值

请注意,这应该发生在一个exe文件中,即使在关闭后,它也会记住历史记录


我已经考虑过在启动应用程序时创建一个文本文件,它可以存储输入历史记录。并在关闭应用程序后保留文本文件,然后在重新打开应用程序时检查该文件。这是可行的但是,当单击输入框,然后选择一个历史输入时,如何显示输入历史?

好的,因此我的示例可能比它需要的更复杂,但我无法确定如何使菜单在这种情况下工作,而不会导致在输入字段中键入问题

我的示例使用一个
Toplevel()
窗口作为菜单,用于保存先前输入的部分匹配值

其思想是通过将
Return
绑定到记录输入字段的函数,然后通过将所有键绑定到检查函数,将所有记录的值与当前输入字段中的值进行检查,从而保留以前输入的内容的记录

使用跟踪变量,我们可以跟踪顶级窗口是否存在,还可以确保在未找到匹配项时不显示顶级窗口

我还没有弄清楚的一个问题是删除按钮的边框,使它们看起来更像传统的下拉菜单

如果你有任何问题,请告诉我

import tkinter as tk


class App(tk.Frame):

    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master)
        self.master = master
        self.master.geometry("150x100")
        self.entry = tk.Entry(self.master)
        self.entry.grid(row=0, column=0)
        self.list_previous_entries = []
        self.top_menu = None
        self.entry.bind("<Key>", lambda event: self.check_previous_entries(event))
        self.entry.bind("<Return>", self.record_previous_entries)

    def check_previous_entries(self, event=None):
        xx = self.entry.get().strip()  
        list_partial_matches = []
        if xx.strip() != "":
            x = self.entry.winfo_rootx()
            y = self.entry.winfo_rooty()
            try:
                self.top_menu.destroy()
            except:
                print("No active top")

            for item in self.list_previous_entries:
                    if xx in item:
                        list_partial_matches.append(item)  

            if list_partial_matches != []: 
                self.top_menu = tk.Toplevel(self)
                self.top_menu.geometry("+{}+{}".format(x, y+20))
                self.top_menu.overrideredirect(1)
                for item in list_partial_matches:
                    tk.Button(self.top_menu, text=item, highlightthickness=0,
                              command=lambda i=item: self.select_word(i), anchor="w").pack(fill="x")
        else:
            if self.top_menu != None:
                self.top_menu.destroy()
                self.top_menu = None

        self.entry.focus()

    def record_previous_entries(self, event):
        print("test2")
        x = self.entry.get()
        if x not in self.list_previous_entries:
            self.list_previous_entries.append(x)

    def select_word(self, word):
        self.entry.delete(0, "end")
        self.entry.insert(0, word)
        self.top_menu.destroy()


if __name__ == '__main__':
    root = tk.Tk() 
    MyApp = App(root).grid(row=0, column=0, sticky="nsew")
    root.columnconfigure(0, weight=1)
    tk.mainloop()
将tkinter作为tk导入
类应用程序(tk.Frame):
定义初始值(self、master、*args、**kwargs):
tk.Frame.\uuuuu init\uuuuuuu(自,主)
self.master=master
自主几何(“150x100”)
self.entry=tk.entry(self.master)
self.entry.grid(行=0,列=0)
self.list_先前的_条目=[]
self.top\u菜单=无
self.entry.bind(“,lambda事件:self.check_previous_条目(事件))
self.entry.bind(“,self.record\u先前的\u条目)
def check_先前的_条目(自身,事件=无):
xx=self.entry.get().strip()
列出部分匹配项=[]
如果xx.strip()!="":
x=self.entry.winfo_rootx()
y=self.entry.winfo_rooty()
尝试:
self.top_menu.destroy()
除:
打印(“无活动顶部”)
对于self.list_中的项目之前的_条目:
如果项目中有xx:
列出部分匹配项。追加(项)
如果列表_部分_匹配!=[]: 
self.top_菜单=tk.Toplevel(self)
self.top_菜单.geometry(“++{}++{}”.format(x,y+20))
self.top\u菜单。覆盖直接(1)
对于列表中的项目\u部分\u匹配:
tk.按钮(self.top_菜单,text=项目,highlightthickness=0,
command=lambda i=item:self.选择单词(i),anchor=“w”).打包(fill=“x”)
其他:
如果self.top_菜单!=无:
self.top_menu.destroy()
self.top\u菜单=无
self.entry.focus()
def记录以前的条目(自身、事件):
打印(“测试2”)
x=self.entry.get()
如果x不在self.list\u之前的\u条目中:
self.list\u previous\u entries.append(x)
def选择单词(自我,单词):
self.entry.delete(0,“结束”)
self.entry.insert(0,word)
self.top_menu.destroy()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=tk.tk()
MyApp=App(root).grid(行=0,列=0,sticky=“nsew”)
root.columnconfigure(0,权重=1)
tk.mainloop()
结果:

这是当你输入3个不同的单词并保存每个单词时得到的结果


通过单击显示的任何按钮,它将用该单词替换输入字段中的内容。

您可能需要设置一个在输入字段底部弹出的菜单。输入字段可能链接到一个函数,该函数将当前键入的数据检查为以前输入的值列表,然后只要输入字段有焦点,就显示这些值。谢谢您的回答。我会尝试一下,如果可行的话,我会接受答案,尽管我希望有一个更简单的解决方案。但看起来这是唯一的办法。@AhmedWas这可能不是唯一的办法。这正是我能想出的方法。我相信有更好的办法。我就是找不到。