2016-12-30 178 views
0

我一直在努力嘗試解決這個問題。當使用tkinter和python時,我可以使用什麼方法來使用按鈕返回函數的值?這裏是我現在的代碼Python:tkinter:創建自定義窗口提示

def choice_message (message_title, message, choice_1, choice_2): 
    new_window = Tk() 
    new_window.minsize (400, 150) 
    new_window.maxsize (400, 150) 
    new_window.title (str (message_title)) 
    Label (new_window, text = message, font = "Arial", wrap = 380, anchor = NW).place (x = 10, y = 0, width = 400, height = 100) 

    def yes(): 
     new_window.destroy() 
     # Added code 

    def no(): 
     new_window.destroy() 
     # Added code (same as yes but returns false (??)) 

    Button (new_window, text = str (choice_1), font = "Arial", anchor = CENTER, command = yes).place (x = 90, y = 110, width = 100, height = 30) 
    Button (new_window, text = str (choice_2), font = "Arial", anchor = CENTER, command = no).place (x = 210, y = 110, width = 100, height = 30) 

# .... 

if (choice_message ("Hello", "This is a message text", "True", "False") == True): 
    print ("The Window Works...") 
+1

請修正你的代碼的縮進。我_think_所有東西都是在'choice_message'函數中定義的,但目前很難說。 –

+1

有幾種方法可以做你想做的事,但使用[標準對話框]會更簡單(http://effbot.org/tkinterbook/tkinter-standard-dialogs.htm)。順便說一句,如果你的代碼已經用'Tk()'創建了一個根窗口,或者多次調用'choice_message',你將會遇到問題,因爲在Tkinter程序中應該只有一個根窗口。相反,'choice_message'應該創建一個['TopLevel'](http://effbot.org/tkinterbook/toplevel.htm)小部件。 –

回答

-1

您將不得不以不同的方式構建它。

您可以創建一個具有self.result的類,它必須使用wait_window(),因此它將等到您關閉窗口。然後你可以從價值self.result

你可以使用這個類在choice_message:

import tkinter as tk 

# --- classes --- 
# you can put this class in separated file 
# (it will need `import tkinter`) 

import tkinter 

class MsgBox(tkinter.Toplevel): 

    def __init__(self, title="MsgBox", message="Hello World", choice1="OK", choice2="Cancel"): 
     tkinter.Toplevel.__init__(self) 

     self.result = None 

     self.choice1 = choice1 
     self.choice2 = choice2 

     self.title(title) 

     self.label = tkinter.Label(self, text=message, bg='white') 
     self.label.pack(ipadx=50, ipady=20) 

     self.button = tkinter.Button(self, text=str(self.choice1), command=self.on_press_choice1) 
     self.button.pack(side='left', ipadx=5, padx=10, pady=10) 

     self.button = tkinter.Button(self, text=str(self.choice2), command=self.on_press_choice2) 
     self.button.pack(side='right', ipadx=5, padx=10, pady=10) 

     # don't return to main part till you close this MsgBox 
     self.wait_window() 

    def on_press_choice1(self): 
     self.result = self.choice1 
     self.destroy() 

    def on_press_choice2(self): 
     self.result = self.choice2 
     self.destroy() 

# --- functions --- 

def choice_message(title, message, choice1, choice2): 

    msg = MsgBox(title, message, choice1, choice2) 
    # MsgBox is waiting till you close it 
    return msg.result 

def choose(): 
    if choice_message("Hello", "This is a message text", True, False) == True: 
     print("You choose: True") 
    else: 
     print("You choose: False") 

def about(): 
    msg = MsgBox() 
    # MsgBox is waiting till you close window 
    print("You choose:", msg.result) 

def close(): 
    msg = MsgBox('Closing', 'Are you sure?', 'Yes', 'No') 
    # MsgBox is waiting till you close window 
    if msg.result == 'Yes': 
     root.destroy() 

# --- main --- 

root = tk.Tk() 

b = tk.Button(root, text="Choose", command=choose) 
b.pack(fill='x', expand=True) 

b = tk.Button(root, text="About", command=about) 
b.pack(fill='x', expand=True) 

b = tk.Button(root, text="Close", command=close) 
b.pack(fill='x', expand=True) 

root.mainloop() 

主要MSGBOX:

Main MsgBox window

選擇:

Choose window

關於:

About window

關閉:

Close window

+0

當提示打開時,您仍然可以與主窗口進行交互。用戶可以打開12個「關於」窗口的副本 –