Python Tkinter:从另一个窗口打开同一窗口时的行为不同

沙发

我曾经Tkinter用自定义的自动完成条目创建一个窗口。

直接使用自动完成条目(带有“ direct”命令行参数)运行窗口时,该条目可以正常工作,当键入下划线时,该条目建议使用4个硬编码的字符串。

在另一个窗口(带有“间接”命令行参数)双击事件后运行该窗口时,自动完成输入无效更新:更准确地说,自动完成功能在第一个窗口(而不是具有自动完成功能的窗口)上显示选项。

是什么导致这种不一致?如何在两种情况下都可以使用?

参见附件:

from Tkinter import *
from ttk import Frame, Label, Style

class AutocompleteEntry(Entry):
    def __init__(self, contacts, mainComposeMailWindow, *args, **kwargs):
        Entry.__init__(self, *args, **kwargs)
        self.contacts = contacts    
        self.mainComposeMailWindow = mainComposeMailWindow
        self.var = self["textvariable"]
        if self.var == '':
            self.var = self["textvariable"] = StringVar()

        self.var.trace('w', self.changed)
        self.bind("<Right>", self.selection)
        self.bind("<Up>", self.up)
        self.bind("<Down>", self.down)

        self.lb_up = False

    def changed(self, name, index, mode):
        words = self.comparison()
        if words:            
            if not self.lb_up:
                self.lb = Listbox()
                self.lb.bind("<Double-Button-1>", self.selection)
                self.lb.bind("<Right>", self.selection)
                self.lb.place(x=self.winfo_x(), y=self.winfo_y()+self.winfo_height())
                self.lb_up = True

            self.lb.delete(0, END)
            for w in words:
                self.lb.insert(END,w)
        else:
            if self.lb_up:
                self.lb.destroy()
                self.lb_up = False

    def selection(self, event):
        if self.lb_up:
            self.var.set(self.lb.get(ACTIVE))
            self.lb.destroy()
            self.lb_up = False
            self.icursor(END)

    def up(self, event):
        if self.lb_up:
            if self.lb.curselection() == ():
                index = '0'
            else:
                index = self.lb.curselection()[0]
            if index != '0':                
                self.lb.selection_clear(first=index)
                index = str(int(index)-1)                
                self.lb.selection_set(first=index)
                self.lb.activate(index) 

    def down(self, event):
        if self.lb_up:
            if self.lb.curselection() == ():
                index = '0'
            else:
                index = self.lb.curselection()[0]
            if index != END:                        
                self.lb.selection_clear(first=index)
                index = str(int(index)+1)        
                self.lb.selection_set(first=index)
                self.lb.activate(index) 

    def comparison(self):
        return [w for w in self.contacts if w.lower().startswith(self.var.get().lower())]

    def get_content(self):
        return self.var.get()

class AutoCompleteWindow:
    def __init__(self):
        autocomplete_choices = ['_This', '_order', '_is', '_important']
        self.root = Tk()
        self.root.minsize(300,300)
        Label(self.root, text="Enter text:").grid(row=0)
        self.autocomplete_entry = AutocompleteEntry(autocomplete_choices, self, self.root, bd = 2, width=50)
        self.autocomplete_entry.grid(row=0, column=1)
        self.root.mainloop() 

def on_open_window(event):
    AutoCompleteWindow()

def makeWindow ():
    global select
    win = Tk()
    frame3 = Frame(win)
    frame3.pack()
    scroll = Scrollbar(frame3, orient=VERTICAL)
    select = Listbox(frame3, yscrollcommand=scroll.set, height=17, width=100)
    select.bind("<Double-Button-1>" , on_open_window)
    scroll.config (command=select.yview)
    scroll.pack(side=RIGHT, fill=Y)
    select.pack(side=LEFT,  fill=BOTH, expand=1)
    return win

def setSelect () :
    scrollbar_choices = ["first", "second", "third"]
    select.delete(0,END)
    for a_choice in scrollbar_choices:
        select.insert(END, a_choice)

def intro_window():
    win = makeWindow()
    setSelect ()
    win.mainloop()

if __name__ == "__main__":
    if sys.argv[1] == "indirect":
        intro_window()
    elif sys.argv[1] == "direct":
        AutoCompleteWindow()
布莱恩·奥克利(Bryan Oakley)

问题是您要创建多个根窗口并运行多个事件循环(尽管一次仅运行一个)。Tkinter的设计与正好一个实例上运行Tk,与mainloop()调用一次。如果您需要其他窗口,则应创建的实例Toplevel

问题的另一部分是您没有给列表框指定显式父项,因此它始终会出现在根窗口中。您需要为列表框指定一个显式父项。具体来说,它应该与条目小部件具有相同的父级。

假设的第一个元素*args是父元素(这是一个错误的假设,但在这种非常特殊的情况下似乎成立),一个真正的快速解决方案是:

class AutocompleteEntry(Entry):
    def __init__(self, contacts, mainComposeMailWindow, *args, **kwargs):
        self.parent = args[0]
        ...
    def changed(...):
        ...
        self.lb = Listbox(self.parent)

更好的方法(阅读:更清晰)是将显式声明parent为的关键字参数__init__,因此您不必依赖于参数的特定顺序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python-tkinter:在另一个窗口中打开另一个图像?

来自分类Dev

如何使用python tkinter调用一个窗口到另一个窗口

来自分类Dev

如何在tkinter中使用python 3.5的滚动条打开和关闭另一个窗口?

来自分类Dev

成功登录PyQt5 Python3后打开另一个窗口

来自分类Dev

无法在tkinter python中的另一个窗口中访问列表

来自分类Dev

使用Tkinter窗口运行另一个显示摄像机预览的python文件

来自分类Dev

python tkinter单击按钮打开新窗口并关闭第一个窗口

来自分类Dev

使用Python加入Qt Designer中的另一个窗口

来自分类Dev

另一个cmd窗口中的Python重启脚本

来自分类Dev

Python Tkinter。仅显示一个窗口副本

来自分类Dev

Python tkinter:如何确保在单击时仅创建一个子窗口,而不在每次单击按钮时创建一个新窗口?

来自分类Dev

Python tkinter:如何确保在单击时仅创建一个子窗口,而不在每次单击按钮时创建一个新窗口?

来自分类Dev

如何避免一个Spark Streaming窗口同时运行本机Python代码而阻塞另一个窗口

来自分类Dev

如何在 Python 3 的另一个窗口中从 Entry 打印一些东西?

来自分类Dev

打开另一个弹出窗口时关闭

来自分类Dev

Python Tkinter:如何创建顶级窗口并销毁前一个窗口?

来自分类Dev

在python Tkinter中的另一个框架内

来自分类Dev

如何在python中使用wnck将gtk窗口从工作区移动到另一个工作区?

来自分类Dev

如何从另一个 .py 文件运行 python 脚本并在当前窗口中显示

来自分类Dev

打开另一个窗口后关闭窗口?

来自分类Dev

如何从另一个类正确访问一个类的 StringVar() - Python - tkinter

来自分类Dev

python中使用另一个类对象的列表作为类属性时的奇怪行为

来自分类Dev

在打开另一个弹出窗口时如何隐藏活动弹出窗口?

来自分类Dev

从另一个窗口打开宏弹出窗口时未触发回调

来自分类Dev

python 不在同一个 cmd 窗口中运行

来自分类Dev

从另一个外壳中的另一个Python脚本中打开一个Python脚本

来自分类Dev

Python从一个循环中打开多个显示窗口

来自分类Dev

Windows + Python:为什么第一个打开的窗口未显示为活动状态?

来自分类Dev

Python从一个循环中打开多个显示窗口

Related 相关文章

  1. 1

    python-tkinter:在另一个窗口中打开另一个图像?

  2. 2

    如何使用python tkinter调用一个窗口到另一个窗口

  3. 3

    如何在tkinter中使用python 3.5的滚动条打开和关闭另一个窗口?

  4. 4

    成功登录PyQt5 Python3后打开另一个窗口

  5. 5

    无法在tkinter python中的另一个窗口中访问列表

  6. 6

    使用Tkinter窗口运行另一个显示摄像机预览的python文件

  7. 7

    python tkinter单击按钮打开新窗口并关闭第一个窗口

  8. 8

    使用Python加入Qt Designer中的另一个窗口

  9. 9

    另一个cmd窗口中的Python重启脚本

  10. 10

    Python Tkinter。仅显示一个窗口副本

  11. 11

    Python tkinter:如何确保在单击时仅创建一个子窗口,而不在每次单击按钮时创建一个新窗口?

  12. 12

    Python tkinter:如何确保在单击时仅创建一个子窗口,而不在每次单击按钮时创建一个新窗口?

  13. 13

    如何避免一个Spark Streaming窗口同时运行本机Python代码而阻塞另一个窗口

  14. 14

    如何在 Python 3 的另一个窗口中从 Entry 打印一些东西?

  15. 15

    打开另一个弹出窗口时关闭

  16. 16

    Python Tkinter:如何创建顶级窗口并销毁前一个窗口?

  17. 17

    在python Tkinter中的另一个框架内

  18. 18

    如何在python中使用wnck将gtk窗口从工作区移动到另一个工作区?

  19. 19

    如何从另一个 .py 文件运行 python 脚本并在当前窗口中显示

  20. 20

    打开另一个窗口后关闭窗口?

  21. 21

    如何从另一个类正确访问一个类的 StringVar() - Python - tkinter

  22. 22

    python中使用另一个类对象的列表作为类属性时的奇怪行为

  23. 23

    在打开另一个弹出窗口时如何隐藏活动弹出窗口?

  24. 24

    从另一个窗口打开宏弹出窗口时未触发回调

  25. 25

    python 不在同一个 cmd 窗口中运行

  26. 26

    从另一个外壳中的另一个Python脚本中打开一个Python脚本

  27. 27

    Python从一个循环中打开多个显示窗口

  28. 28

    Windows + Python:为什么第一个打开的窗口未显示为活动状态?

  29. 29

    Python从一个循环中打开多个显示窗口

热门标签

归档