为了账号安全,请及时绑定邮箱和手机立即绑定

使用 tkinter 进行 Python GUI 编程

使用 tkinter 进行 Python GUI 编程

婷婷同学_ 2024-01-27 16:13:23
我有一个有多行的表单。按 Enter 键会打开一个选项窗口。但每次我按回车键时,它都会打开一个新的选项窗口。我如何控制和检查选项窗口是否打开然后不打开选项窗口。import tkinter as tkfrom tkinter import ttkfrom tkinter import *from tkinter import messagebox# Directory/File processing librariesimport osimport configparserimport csvdef callback():    #messagebox.showinfo("Netezza", Folder_Name_var.get())    #messagebox.showinfo("Netezza", Table_Name_var.get() )    config = configparser.ConfigParser()    config.read('C:\\aa\\config.ini')    #for value in config['Folder']: print(value)    for key in config.items('Folder'):        print (key[1].replace('{Folder_Name}',Folder_Name_var.get()))        os.makedirs(key[1].replace('{Folder_Name}',Folder_Name_var.get()),exist_ok=True)def click_tv(event):    #messagebox.showinfo("Inside")    selected=trv.focus()    print(trv.item(selected))def press_enter(event):    #messagebox.showinfo("Inside")    selected=trv.focus()    print(trv.item(selected))    print(str((event.keysym)))    if str((event.keysym))=='Return':        option_wnd=Toplevel(root)        option_wnd.geometry('200x200')        option_wnd.title('Option Window')        option_wnd.grab_set()        #option_wnd.pack()def selection_change(event):    selected = trv.selection()[0]    print('You clicked on', trv.item(selected))    #option_wnd.mainloop()root = Tk()Folder_Name_var = tk.StringVar()Table_Name_var = tk.StringVar()# This is the section of code which creates the main windowroot.geometry('873x498')root.configure(background='#63B8FF')root.title('Automation Software - Blue Shield of California')pic= Canvas(root, height=100, width=100)#pic= Canvas(root, height=225, width=580)#picture_file = PhotoImage(file = 'c:\\aa\\bsc.png')#pic.create_image(0, 0, anchor=NW, image=picture_file)#pic.place(x=5, y=5)每次我在根窗口上按 Enter 键时,都会打开一个弹出窗口。我需要控制它。如果弹出窗口打开,那么我们不应该允许另一个弹出窗口打开。
查看完整描述

4 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

直接的方法是使用winfo_exists():


root.option_wnd = None # Init value


def press_enter(event):

    #messagebox.showinfo("Inside")

    selected=trv.focus()

    print(trv.item(selected))

    print(str((event.keysym)))

    if str((event.keysym))=='Return': 

        if root.option_wnd and root.option_wnd.winfo_exists():

            root.option_wnd.lift() # make this window on the top.

        else: # create this window

            root.option_wnd  = tk.Toplevel(root)

            .....

但我认为你不需要每次用户输入时都创建这个窗口。Enter在开始时创建它,只需在用户输入时显示它Enter


例如:


root = tk.Tk()

option_wnd = tk.Toplevel()

option_wnd.wm_protocol("WM_DELETE_WINDOW", option_wnd.withdraw) # when user try to close this window, hide it instead of destroy it

.....



option_wnd.withdraw() # hide this window


def press_enter(event):

    #messagebox.showinfo("Inside")

    selected=trv.focus()

    print(trv.item(selected))

    print(str((event.keysym)))

    if str((event.keysym))=='Return': 

        option_wnd.deiconify() # show it.


查看完整回答
反对 回复 2024-01-27
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

我能想到的一个选项是像这样绑定选项窗口:

option_wnd.bind('<Return>', lambda e: option_wnd.close()) # or withdraw() or quit() ?

将选项窗口绑定到按下 Enter 键时它会关闭(尽管我不知道上述函数的差异(有,所以你应该查找)),但是如果你想使用Enter(返回)输入值,这可能会妨碍你键,因为它将关闭窗口。另一个选项是将选项窗口绑定到此事件:

option_wnd.bind('<FocusOut>', lambda e: option_wnd.close())

这是当窗口不再受到关注时,因此如果您按 Enter 键,它将打开一个新窗口,但仍然打赌旧窗口应该关闭。您也可以尝试用某些东西进行一些逻辑编程,例如当输入按下“打开”模式时,再次按下它不会打开窗口,而当您关闭现有窗口时,它将再次允许这种情况。


查看完整回答
反对 回复 2024-01-27
?
ITMISS

TA贡献1871条经验 获得超8个赞

def press_enter(event):

    #messagebox.showinfo("Inside")

    root.deiconify ()

    selected=trv.focus()

    print(trv.item(selected))

    print(str((event.keysym)))

    if str((event.keysym))=='Return':

        option_wnd=Toplevel(root)

        option_wnd.geometry('200x200')

        option_wnd.title('Option Window')

        option_wnd.grab_set()

        #option_wnd.pack()


查看完整回答
反对 回复 2024-01-27
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

如果您不使用类,您可以执行以下操作:


options_displayed = False #global


def option_closed(w):

    global options_displayed

    w.destroy() #close the actual window

    options_displayed = False # log the fact it is now close


def press_enter(event):

    global options_displayed # reference global variable

    #messagebox.showinfo("Inside")

    selected=trv.focus()

    print(trv.item(selected))

    print(str((event.keysym)))

    if str((event.keysym))=='Return' and not options_displayed:

        option_wnd=Toplevel(root)

        option_wnd.geometry('200x200')

        option_wnd.title('Option Window')

        option_wnd.grab_set()

        option_wnd.grab_set()

        option_wnd.protocol("WM_DELETE_WINDOW", lambda w= option_wnd :option_closed(w))

        



查看完整回答
反对 回复 2024-01-27
  • 4 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信