2013-04-20 4 views
2

파이썬 3.3에서 tkinter를 사용하여 (아주) 간단한 계산기 스크립트를 작성했습니다. IDLE을 통해 스크립트를 실행할 때 제대로 작동하는 것 같습니다. 그러나 단순히 .py 파일을 두 번 클릭하여 실행하면 작동하지 않습니다. 다시 사라지기 전에 cmd 창이 30 초 동안 팝업됩니다.내 간단한 tkinter 계산기 스크립트는 IDLE을 실행할 때만 작동합니다. 왜?

"python calculator.py"를 사용하여 명령 프롬프트를 실행하려고했지만 그 중 하나도 작동하지 않았습니다. 그러나 "python"을 입력하여 cmd 내에서 Python 인터프리터를 가져온 다음 계산기를 가져 와서 제대로 작동했습니다.

Google 검색에서 문제를 발견하고 비슷한 stackOverflow 관련 질문을 한 사람 중 누구도이 문제를 해결하지 못했다. 이것은 처음, 일주일 전이 아닙니다. 암호를 가져 와서 해시 등을 검사 한 USB 스틱 용 Python 보안 플러그인을 코딩하고 Python을 USB 스틱에 설치했습니다. 요즘에는 PythonW로 열었을 때 아무 일도 일어나지 않았습니다. 그리고 IDLE과 함께 일관되게 열어야하고 거기에서 시작해야합니다.

필자는 계산기 용 코드를 동봉했다. 비효율적이며 잘못 코딩 된 것을 알고 있지만 아직 정리하지는 못했다.

from tkinter import * 
class calculator: 
    def __init__(self): 
     self.root = Tk() 
     self.menu = Menu(self.root) 
     self.menu.add_command(label="Quit", command=self.root.destroy) 
     self.root.config(menu=self.menu) 
     self.root.title("Calculator") 
     self.display = Entry(self.root) 
     self.display.grid(row=1, column=0, columnspan=5) 
     self.dot = False 
     self.equalsdone = False 
     Label(self.root).grid(row=2, column=0) 
     Button(self.root, text="1", width=5, foreground="blue", command=lambda: self.addNumber("1")).grid(row=4, column=0) 
     Button(self.root, text="2", width=5, foreground="blue", command=lambda: self.addNumber("2")).grid(row=4, column=1) 
     Button(self.root, text="3", width=5, foreground="blue", command=lambda: self.addNumber("3")).grid(row=4, column=2) 
     Button(self.root, text="4", width=5, foreground="blue", command=lambda: self.addNumber("4")).grid(row=5, column=0) 
     Button(self.root, text="5", width=5, foreground="blue", command=lambda: self.addNumber("5")).grid(row=5, column=1) 
     Button(self.root, text="6", width=5, foreground="blue", command=lambda: self.addNumber("6")).grid(row=5, column=2) 
     Button(self.root, text="7", width=5, foreground="blue", command=lambda: self.addNumber("7")).grid(row=6, column=0) 
     Button(self.root, text="8", width=5, foreground="blue", command=lambda: self.addNumber("8")).grid(row=6, column=1) 
     Button(self.root, text="9", width=5, foreground="blue", command=lambda: self.addNumber("9")).grid(row=6, column=2) 
     Button(self.root, text="0", width=5, foreground="blue", command=lambda: self.addNumber("0")).grid(row=7, column=1) 
     Button(self.root, text=".", width=5, command=lambda: self.addNumber(".")).grid(row=7, column=0) 
     Button(self.root, text="=", width=12, command=lambda: self.Equals()).grid(row=8, column=2, columnspan=2) 
     Button(self.root, text="(", width=5, foreground="red", command=lambda: self.addNumber("(")).grid(row=8, column=0) 
     Button(self.root, text=")", width=5, foreground="red", command=lambda: self.addNumber(")")).grid(row=8, column=1) 
     Button(self.root, text="X", width=5, foreground="red", command=lambda: self.addNumber("x")).grid(row=4, column=3) 
     Button(self.root, text="÷", width=5, foreground="red", command=lambda: self.addNumber("÷")).grid(row=5, column=3) 
     Button(self.root, text="-", width=5, foreground="red", command=lambda: self.addNumber("-")).grid(row=6, column=3) 
     Button(self.root, text="+", width=5, foreground="red", command=lambda: self.addNumber("+")).grid(row=7, column=3) 
     Button(self.root, text="C", width=5, command=lambda:self.clear("all")).grid(row=3, column=3) 
     Button(self.root, text="Del.", width=5, command=lambda:self.clear("1")).grid(row=3, column=2) 
    def clear(self, amount): 
     if amount == "all": 
      self.display.delete(0, END) 
     elif amount == "1": 
      if self.equalsdone == True: 
       self.equalsdone = False 
       y = self.display.get() 
       yAct = y[1:] 
       self.display.delete(0, END) 
       self.display.insert(0, yAct) 
       self.display.delete(len(yAct)-1, END) 
      else: 
       z = len(self.display.get()) 
       self.display.delete(z-1, END) 
    def addNumber(self, number): 
     if self.equalsdone == True: 
      self.equalsdone = False 
      if number == "x" or number == "÷" or number == "+" or number == "-": 
       y = self.display.get() 
       yAct = y[1:] 
       self.display.delete(0, END) 
       self.display.insert(0, yAct) 
       self.display.insert(END, number) 
      else: 
       self.display.delete(0, END) 
       self.display.insert(0, number) 
     elif number == ".": 
      if self.dot == True: 
       pass 
      else: 
       self.dot = True 
       self.display.insert(END, number) 
     elif number == "x" or number == "-"or number == "+"or number == "÷": 
      self.dot = False 
      self.display.insert(END, number) 
     else: 
      self.display.insert(END, number)  
    def doEquation(self, operator): 
     def setwaiting(operator): 
      if operator == "x": 
       self.waitingx = True 
      if operator == "÷": 
       self.waitingd = True 
      if operator == "+": 
       self.waitingp = True 
      if operator == "-": 
       self.waitingt = True 
     if self.waiting == False: 
      self.waiting = True 
      setwaiting(operator) 
     elif self.waitingx == True: 
      self.waitingx = False 
      setwaiting(operator) 
      self.no1f = float(self.no1) 
      self.no2f = float(self.no2) 
      x = self.no1f*self.no2f 
      self.no1 = str(x) 
      self.no2 = "" 
      print(self.no1) 
     elif self.waitingd == True: 
      self.waitingd = False 
      setwaiting(operator) 
      self.no1f = float(self.no1) 
      self.no2f = float(self.no2) 
      x = self.no1f/self.no2f 
      self.no1 = str(x) 
      self.no2 = "" 
      print(self.no1) 
     elif self.waitingt == True: 
      self.waitingt = False 
      setwaiting(operator) 
      self.no1f = float(self.no1) 
      self.no2f = float(self.no2) 
      x = self.no1f-self.no2f 
      self.no1 = str(x) 
      self.no2 = "" 
      print(self.no1) 
     elif self.waitingp == True: 
      self.waitingp = False 
      setwaiting(operator) 
      self.no1f = float(self.no1) 
      self.no2f = float(self.no2) 
      x = self.no1f+self.no2f 
      self.no1 = str(x) 
      self.no2 = "" 
      print(self.no1) 
     else: 
      setwaiting(operator) 
    def Equals(self): 
     self.length = len(self.display.get()) 
     self.equation = self.display.get() 
     self.waiting = False 
     self.no1 = "" 
     self.no2 = "" 
     self.lena = 0 
     self.waitingx = False 
     self.waitingd = False 
     self.waitingt = False 
     self.waitingp = False 
     for item in self.equation: 
      self.lena += 1 
      if item == "x": 
       self.doEquation(operator="x") 
      elif item == "÷": 
       self.doEquation(operator="÷") 
      elif item == "-": 
       self.doEquation(operator="-") 
      elif item == "+": 
       self.doEquation(operator="+") 
      else: 
       if self.waiting == False: 
        self.no1 += item 
       elif self.waiting == True: 
        self.no2 += item 
      if self.lena == self.length: 
       self.doEquation(operator=False) 
     self.display.delete(0, END) 
     self.display.insert(0, "=" + self.no1) 
     self.equalsdone = True 
calculator() 
+0

'python calculator.py'를 사용하여 어떤 오류가 있었습니까? – Aya

+2

'__init__' 메소드 끝에'self.root.mainloop()'을 추가해야합니다 : http://stackoverflow.com/questions/8683217/tkinter-when-do-i-need-to-call-mainloop – kalgasnik

답변

2

루트 창에서 mainloop 메서드를 호출해야합니다. IDLE은 자동으로이 작업을 수행합니다 (또는 구현 방법의 부작용으로 어떤 것인지 잘 모르겠습니다). 귀하의 경우에 당신은 __init__calculator 클래스의 마지막 문장으로 이것을 넣고 싶을 것입니다.

mainloop은 작업중인 Tkinter 응용 프로그램의 기본 요소입니다. 키보드, 마우스 및 운영 체제의 이벤트를 수신하여 해당 콜백으로 전달합니다. 이 이벤트 루프가 없으면 이벤트가 처리되지 않으며 이벤트가 처리되지 않으면 창은 화면에서 스스로 그릴 수 없습니다.

0

IDLE은 사용자가 콘솔에서 python -i file.py을 실행 한 것처럼 편집기에서 file.py를 실행합니다. -i 옵션은 프로그램과 상호 작용할 수 있도록 프로그램을 실행 상태로 유지합니다. 따라서 실행 후 콘솔과 상호 작용하려면 -i 옵션을 사용하여 콘솔에서 file.py를 실행하거나 root.mainloop을 추가하여 프로그램을 활성 상태로 유지해야합니다.

관련 문제