2016-06-01 3 views
0

tkinter를 사용하여 GUI를 만들려고합니다. 여기에 코드가 있습니다. 그러나, 내가 그것을 실행할 때, 설정을 클릭하고 다시, 파이썬 충돌합니다. 왜 이런 일이 일어나고 어떻게 해결할 수 있을지 아십니까? 그것도 내가 파괴 기능을 실행할 때 발생, 또는 나는 다른 TK에 창에 뭔가를 할 때Tkinter destroy 메서드가 프로그램을 충돌시킵니다.

코드 : (일부는 필요하지 않을 수도 있습니다,하지만 난 그것을 포함)

import tkinter as tk 

class moveFrame(): 
    def move(self, event): 
     widget = event.widget 
     widget.place(x = widget.winfo_x() + event.x - widget.startX, y = widget.winfo_y() + event.y - widget.startY) 

def resize(self, event): 
    widget = event.widget 
    wlength = widget["length"] 
    wwidth = widget["width"] 
    widget.config(length = wlength + event.x - widget.startX, width = wwidth + event.y - widget.startY) 

def getPos(self, event): 
    widget = event.widget 
    widget.lift() 
    widget.startX, widget.startY = event.x, event.y 

def __init__(self, master, frameInfo, xPos, yPos): 
    self.frame = tk.Frame(master, cnf = frameInfo) 
    self.frame.bind("<Button-1>", self.getPos) 
    self.frame.bind("<B1-Motion>", self.move) 
    self.frame.bind("<B3-Motion>", self.getPos) 
    self.frame.bind("<Button-3>", self.resize) 
    self.frame.place(x = xPos, y = yPos) 


def homescreen(): 
    screen = tk.Tk() 
    #arrangeButton = tk.Canvas(screen, width = 120, height = 40, bg = "purple") 
    #arrangeButton.create_text(60, 20, text = "Arrange Homescreen") 
    #arrangeButton.place(x = 0, y = 0) 
    #arrangeButton.bind("<Button-1>", lambda event: arrange(arrangeButton)) 
    settingsButton = tk.Canvas(screen, width = 60, height = 60) 
    settingsButton.place(x = 20, y = 20) 
    settingsButton.create_oval(5, 5, 58, 58, fill = "#a6a6a6", tags = "click") 
    settingsButton.create_oval(15, 10, 58, 53, fill = "#000", tags = "click") 
    settingsButton.create_oval(27, 22, 46, 41, fill = "#00f", tags = "click") 
    settingsButton.tag_bind("click", "<Button-1>", lambda event: settings()) 

def settings(): 
    sscreen = tk.Tk() 
    #Get previous settings 
    try: 
     file = open("settings.txt", "r") 
    except IOError: 
     file = open("settings.txt", "x") 
    finally: 
     file = open("settings.txt", "r+") 
    curSet = [x.strip("\n") for x in file.readlines()] 
    #Widgets 
    back = tk.Canvas(sscreen, width = 60, height = 48) 
    back.place(x = 20, y = 20) 
    back.create_rectangle(25, 22, 60, 26, fill = "#000", tags = "sclick") 
    back.create_polygon(10, 24, 25, 10, 25, 38, fill = "#000", tags = "sclick") 
    back.create_text(42, 32, text = "Back", tags = "sclick") 
    back.tag_bind("sclick", "<Button-1>", lambda event: sscreen.destroy()) 

def arrange(*widgets): 
    arrangeScreen = tk.Tk() 
    arrangeButton = widgets[0] 
    aBaF = moveFrame(arrangeScreen, {"bd" : 4, "bg" : "#a6a6a6"}, arrangeButton.winfo_x() - 4, arrangeButton.winfo_y() - 4) 
    aBa = tk.Canvas(aBaF, width = 120, height = 40, bg = "purple") 


def load(goTo, ms): 
    load = tk.Tk() 
    loadImage = tk.Canvas(load, height = 300, width = 300, bg = "black") 
    loadImage.pack() 
    loadImage.create_oval(125, 130, 175, 180, fill = "white") 
    loadImage.create_oval(130, 140, 170, 150, fill = "black") 
    loadImage.create_oval(130, 140, 171, 151, fill = "white") 
    loadImage.create_oval(152, 140, 148, 150, fill = "black") 
    load.after(ms, lambda: [goTo(), load.destroy()]) 

load(homescreen, 1) 
+1

최소한의 예와 추적은 먼 길을 갈 것입니다. –

+0

IDLE 내에서이 스크립트를 실행합니까? –

+0

"파이썬 충돌"이란 무엇을 의미합니까? 스택 트레이스를 얻었습니까? 또한 코드 샘플의 들여 쓰기가 손상되었습니다. –

답변

1

경우 프로그램은 하나의 응용 프로그램을 나타내며 하나만 Tk 인스턴스를 만듭니다.

Tk 개체는 전체 응용 프로그램의 루트를 나타내며이를 삭제하고 본질적으로 별도의 응용 프로그램을 만들고 다른 응용 프로그램을 참조하면 이전 응용 프로그램에 대한 참조로 인해 파이썬 충돌과 같은 정의되지 않은 동작이 발생합니다.

Tk을 별도의 창으로 사용하는 대신 Toplevel을 그대로 사용하여 별도의 창을 사용하십시오. tk.Toplevel(abs_root) 다음과 같은 tk.Tk()abs_root을 정의하는 프로그램에서 tk.Tk()의 모든 발행 수를 대체함으로써

는 : 프로그램 작업을 만들 것

abs_root = tk.Tk() 
abs_root.withdraw() #hides the window while your program runs. 
load(homescreen, 1) 
abs_root.mainloop() 

그러나 그것은 abs_root가 파괴 될 때까지 실행할 것을 의미 않는 수 없습니다 창으로 표시되어 있지 않으므로 닫기 버튼을 클릭하면 창이 나타나지 않습니다. 명시 적으로 abs_root.destroy()을 호출하거나 처음 생성 된 창을 마지막으로 닫을 창을 선택하고 대신 abs_root으로 사용해야합니다. . (쓰여진대로 프로그램으로는 불가능합니다)

관련 문제