2017-01-30 168 views
1

プログラムのポップアップウィンドウを作成する際に問題があります。tkinterでポップアップウィンドウを作成するにはどうすればいいですか?

コード:

from tkinter import * 
from tkinter import ttk 
import tkinter as tk 

def popupBonus(): 
    popupBonusWindow = tk.Tk() 
    popupBonusWindow.wm_title("Window") 
    labelBonus = Label(popupBonusWindow, text="Input") 
    labelBonus.grid(row=0, column=0) 
    B1 = ttk.Button(popupBonusWindow, text="Okay", command=popupBonusWindow.destroy()) 
    B1.pack() 

class Application(ttk.Frame): 
    def __init__(self, master): 
     ttk.Frame.__init__(self, master) 
     mainwindow = ttk.Frame(self) 

     self.buttonBonus = ttk.Button(self, text="Bonuses", command=popupBonus) 
     self.buttonBonus.pack() 

コードはボタンでウィンドウを生成し、あなたがボタンを押したときに、タイトルの「窓」でポップアップウィンドウを生成することになっています、テキスト「入力」、およびボタンを持っていますポップアップウィンドウを終了してメインウィンドウに戻るには「OK」と言ってください。しかし、私はこのエラーが発生しています。

Traceback (most recent call last): 
    File "D:\Softwares\Python 3.6.0\lib\tkinter\__init__.py", line 1699, in __call__ 
return self.func(*args) 
    File "C:\Users\J---- M--\Desktop\Python\GUI-Messagebox 5.py", line 12, in popupBonus 
B1 = ttk.Button(popupBonusWindow, text="Okay", command=popupBonusWindow.destroy()) 
    File "D:\Softwares\Python 3.6.0\lib\tkinter\ttk.py", line 614, in __init__ 
Widget.__init__(self, master, "ttk::button", kw) 
    File "D:\Softwares\Python 3.6.0\lib\tkinter\ttk.py", line 559, in __init__ 
tkinter.Widget.__init__(self, master, widgetname, kw=kw) 
    File "D:\Softwares\Python 3.6.0\lib\tkinter\__init__.py", line 2293, in __init__ 
(widgetName, self._w) + extra + self._options(cnf)) 
_tkinter.TclError: NULL main window 

問題の原因はわかりません。私は4時間の答えを見つけようとしており、基本的にあきらめました。

また、私は感嘆符のイメージが不要で、後でポップアップウィンドウ内に複数のチェックボックスを含めるので、tkinterのmessagebox機能を使用したくありません。

+1

A)Tk' 'の複数のインスタンスを作成し、そしてb)のhttpが表示されません:// effbot.org/tkinterbook/tkinter-dialog-windows.htm –

+0

'command ='は関数名(コールバック)を期待しています - それは '()'なしを意味します。今度は 'popupBonusWindow.destroy()'とその結果を実行します - 恐らく 'None' - ' command = 'に代入します – furas

答えて

5

は、私が見つかりました。3つのミス

  • 第三/第二のウィンドウ
  • command=を作成するために使用Toplevel()代わりTk()の期待するコールバック - 関数名のない()
    (ただし、popupBonusWindow.destroy()を使用)
  • はしないでください1つのウィンドウまたはフレームにpack()grid()を混ぜて
    (ただし、grid()とを使用してくださいポップアップで)

しかし、あなたはまた、使用することができます内蔵のメッセージボックスshowinfo()よう

import tkinter as tk 
from tkinter import ttk 
from tkinter.messagebox import showinfo 

def popup_bonus(): 
    win = tk.Toplevel() 
    win.wm_title("Window") 

    l = tk.Label(win, text="Input") 
    l.grid(row=0, column=0) 

    b = ttk.Button(win, text="Okay", command=win.destroy) 
    b.grid(row=1, column=0) 

def popup_showinfo(): 
    showinfo("Window", "Hello World!") 

class Application(ttk.Frame): 

    def __init__(self, master): 
     ttk.Frame.__init__(self, master) 
     self.pack() 

     self.button_bonus = ttk.Button(self, text="Bonuses", command=popup_bonus) 
     self.button_bonus.pack() 

     self.button_showinfo = ttk.Button(self, text="Show Info", command=popup_showinfo) 
     self.button_showinfo.pack() 

root = tk.Tk() 

app = Application(root) 

root.mainloop() 
関連する問題