亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 258 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號