2017-01-30 3 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() 

이 코드는 버튼으로 윈도우를 생성하고 버튼을 누르면,이 제목 "창"과 팝업 창을 생성하기로했다, 텍스트 "입력"및 버튼이 있습니다 팝업 창을 종료하고 메인 창으로 돌아가려면 "Okay"라고 말하십시오. 그러나이 오류가 발생합니다.

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() 사용)
  • 그렇지 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() 
관련 문제