簡體   English   中英

Tkinter 入口和按鈕組合功能在其他功能中不起作用

[英]Tkinter entry and button combined function doesn't work in other function

我創建了一個調用 GUI 的函數,該 GUI 具有多個條目和一個按鈕。 如果我按下按鈕,則條目上的值將在函數上返回。

def date_time_gui ():
    win = tk.Tk()
    win.title('powered by Python') # win title
    win.geometry('700x400') # size of win

    # add label on the win
    label = tk.Label(win, 
        text='type the heaving datetime and out water datetime',
        font = ('Arial Bold',25)
        )
    label.place(relx = 0.5, rely = 0.05, anchor = 'n')

    # label and entry for heaving datetime
    heaving_label = tk.Label(win,
        text='type heaving datetime',
        font = ('Arial Bold', 15)
        )
    heaving_label.place(relx = 0.1, rely = 0.3, anchor = 'w')

    h_year_label = tk.Label(win, text='YEAR (4 digits) :')
    h_year_label.place(relx = 0.1, rely = 0.4, anchor = 'w')
    h_year = tk.Entry(win, fg='black', width = 5)
    h_year.place(relx = 0.3, rely = 0.4, anchor = 'w')


    h_month_label = tk.Label(win, text='MONTH (2 digits) :')
    h_month_label.place(relx = 0.1, rely = 0.5, anchor = 'w')
    h_month = tk.Entry(win, fg='black', width = 5)
    h_month.place(relx = 0.3, rely = 0.5, anchor = 'w')


    h_date_label = tk.Label(win, text='DATE (2 digits) :')
    h_date_label.place(relx = 0.1, rely = 0.6, anchor = 'w')
    h_date = tk.Entry(win, fg='black', width = 5)
    h_date.place(relx = 0.3, rely = 0.6, anchor = 'w')


    h_hour_label = tk.Label(win, text='HOUR (24h, 2 digits) :')
    h_hour_label.place(relx = 0.1, rely = 0.7, anchor = 'w')
    h_hour = tk.Entry(win, fg='black', width = 5)
    h_hour.place(relx = 0.3, rely = 0.7, anchor = 'w')

    h_minute_label = tk.Label(win, text='MINUTE (2 digits) :')
    h_minute_label.place(relx = 0.1, rely = 0.8, anchor = 'w')
    h_minute = tk.Entry(win, fg='black', width = 5)
    h_minute.place(relx = 0.3, rely = 0.8, anchor = 'w')



    # label and entry for out water datetime
    outwater_label = tk.Label(win,
        text='type out water datetime',
        font = ('Arial Bold', 15)
        )
    outwater_label.place(relx = 0.5, rely = 0.3, anchor = 'w')

    o_year_label = tk.Label(win, text='YEAR (4 digits) :')
    o_year_label.place(relx = 0.5, rely = 0.4, anchor = 'w')
    o_year = tk.Entry(win, fg='black', width = 5)
    o_year.place(relx = 0.7, rely = 0.4, anchor = 'w')


    o_month_label = tk.Label(win, text='MONTH (2 digits) :')
    o_month_label.place(relx = 0.5, rely = 0.5, anchor = 'w')
    o_month = tk.Entry(win, fg='black', width = 5)
    o_month.place(relx = 0.7, rely = 0.5, anchor = 'w')


    o_date_label = tk.Label(win, text='DATE (2 digits) :')
    o_date_label.place(relx = 0.5, rely = 0.6, anchor = 'w')
    o_date = tk.Entry(win, fg='black', width = 5)
    o_date.place(relx = 0.7, rely = 0.6, anchor = 'w')


    o_hour_label = tk.Label(win, text='HOUR (24h, 2 digits) :')
    o_hour_label.place(relx = 0.5, rely = 0.7, anchor = 'w')
    o_hour = tk.Entry(win, fg='black', width = 5)
    o_hour.place(relx = 0.7, rely = 0.7, anchor = 'w')

    o_minute_label = tk.Label(win, text='MINUTE (2 digits) :')
    o_minute_label.place(relx = 0.5, rely = 0.8, anchor = 'w')
    o_minute = tk.Entry(win, fg='black', width = 5)
    o_minute.place(relx = 0.7, rely = 0.8, anchor = 'w')

    def run_func ():
        global heaving
        global outwater
        heaving = h_year.get()+'.'+h_month.get()+'.'+h_date.get()+' '+h_hour.get()+' '+h_minute.get()
        outwater = o_year.get()+'.'+o_month.get()+'.'+o_date.get()+' '+o_hour.get()+' '+o_minute.get()
        print('here')
        win.destroy()
        print('there')
        return heaving, outwater
    print('else')
    button = ttk.Button(win, text = 'run', command = run_func)  
    button.place(relx = 0.8, rely = 0.9, anchor = 'w')
    print('this')
    win.mainloop()
    print('where')
    return heaving, outwater

如果我在同一腳本中使用以下代碼運行它,它會起作用。

if __name__ == "__main__":
    h, o = date_time_gui()
    print(h,o)

它打印出 h, o 是函數 date_time_gui 的返回值

但是,如果我將此函數應用於其他定義,例如

def other_def():
    ## some code
    heaving_datetime, out_water_datetime = date_time_gui()

它只是停止工作。

我想檢查 date_time_gui 中的哪一行是問題,所以我打印了“那里”、“哪里”等。

當我運行 other_def 時,它會在此處打印出其他內容

然后沒有打印出'where'

我真的不知道有什么問題,因為 date_time_gui 函數本身運行良好。 當我將此應用於其他功能時,它不起作用。

  • 也許,為了運行other_def,我制作了一個帶有復選框的gui來運行other_def。 所以,如果我檢查 gui 上的 other_def 函數並點擊運行按鈕,gui 將被銷毀並且 other_def 將被運行。 並且 date_time_gui 的新 gui 彈出並點擊運行按鈕,然后 gui 銷毀並停止工作。

使用tkinter窗口時

  • 調用loop()方法會激活 tkinter 消息泵並將停止線性 python 代碼,直到窗口關閉
  • 您可以通過手動關閉窗口或從代碼中調用quit()來退出循環。

在您的情況下,調用win.mainloop()停止了線性腳本。

您可以通過將win.quit()添加到run_func函數來退出循環。

試試這個代碼:

    def run_func ():
        global heaving
        global outwater
        heaving = h_year.get()+'.'+h_month.get()+'.'+h_date.get()+' '+h_hour.get()+' '+h_minute.get()
        outwater = o_year.get()+'.'+o_month.get()+'.'+o_date.get()+' '+o_hour.get()+' '+o_minute.get()
        print('here')
        win.destroy()
        print('there')
        win.quit()   # exit gui loop
        return heaving, outwater  # not needed
    
    print('else')
    button = ttk.Button(win, text = 'run', command = run_func)  
    button.place(relx = 0.8, rely = 0.9, anchor = 'w')
    print('this')
    win.mainloop()  # python code stops here until window closed
    print('where')
    heaving, outwater = 3,4  # for testing
    return heaving, outwater

if __name__ == "__main__":
    h, o = date_time_gui()
    print(h,o)

輸出

else
this
here
there
where
3 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM