>

프로그램이 사용 중일 때 (상태 표시기) 캔버스 타원 항목을 색칠하려고합니다. 예상되는 동작은 확인 버튼을 클릭 할 때 캔버스 타원을 빨간색으로 켜고 기능이 완료되면 다시 껐다 켜는 것입니다 (

지금까지 가지고있는 코드는 다음과 같습니다

class App(tk.Tk):
    def __init__(self):  
        tk.Tk.__init__(self)
        self.entryframe = Frame(self, width=800, height=500)
        self.entryframe.pack(fill=X, padx=8, pady=8)
        self.canvas = Canvas(self.entryframe, width=30, height=30)
        # change fill color of the status oval
        self.status = self.canvas.create_oval(10, 10, 30, 30, fill="blue", tags="state")
        self.canvas.grid(row=0, column=1)
        self.label = Label(self.entryframe, text="Enter your sentence:").grid(row=3, column=0, sticky=W)
        self.text = Text(self.entryframe, wrap=WORD, width=70, height=10)
        self.text.grid(row=4, column=0, sticky=W)
        self.btn_h = Button(self.entryframe, text="Check", width="15", command=self.check_input).grid(row=5, column=0, padx=8, pady=8)
    def check_input(self):
        #change status oval color to red
        self.canvas.itemconfig(status, fill='red')
        # after the function is complete turn it back off
        canvas.itemconfig(light_1, fill='blue')
root = App()
root.mainloop()

현재 동작은 항목이 파란색으로 유지되며 전혀 변경되지 않습니다.

  • 답변 # 1

    oval 에 대한 참조를 저장했습니다  클래스 속성으로. 따라서 self 를 전달하여 동일한 방식으로 액세스해야합니다. :

    import tkinter as tk
    from threading import Thread
    import time
    class App(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            self.entryframe = tk.Frame(self, width=800, height=500)
            self.entryframe.pack(fill=tk.X, padx=8, pady=8)
            self.canvas = tk.Canvas(self.entryframe, width=30, height=30)
            # change fill color of the status oval
            self.status = self.canvas.create_oval(10, 10, 30, 30, fill="blue", tags="state")
            self.canvas.grid(row=0, column=1)
            self.label = tk.Label(self.entryframe, text="Enter your sentence:").grid(row=3, column=0, sticky=tk.W)
            self.text = tk.Text(self.entryframe, wrap=tk.WORD, width=70, height=10)
            self.text.grid(row=4, column=0, sticky=tk.W)
            self.btn_h = tk.Button(self.entryframe, text="Check", width="15", command=self.check_input).grid(row=5, column=0, padx=8, pady=8)
        def check_input(self):
            #change status oval color to red
            self.canvas.itemconfig(self.status, fill='red') #use self.status instead
            t = Thread(target=self.lengthy_process,args=("Arg1","Arg2"))
            t.start()
        def lengthy_process(self,param1,param2):
            print (param1, param2)
            time.sleep(10) #simulate the time taken for processing
            print ("Finished!")
            self.canvas.itemconfig(self.status, fill='blue')
    root = App()
    root.mainloop()
    
    

    또한 tk의 인스턴스를 상속하고 나머지 위젯을 작성하는 방법으로 판단하면 두 import tkinter as tk 가 혼합 된 것처럼 보입니다.  그리고 from tkinter import * . 이것은 일반적으로 나쁜 습관으로 간주됩니다-단순히 import tkinter as tk 를 사용하는 것이 더 합리적입니다   tk 에 속하는 위젯을 알 수 있습니다. 및 ttk 에 속하는  필요한 경우. "import *"가 왜 나쁜가요?

  • 이전 javascript - 크롬 확장 프로그램의 contentjs에서 몇 초마다 DOM 요소를 확인할 수있는 방법이 있습니까?
  • 다음 configuration : nginx 403 오류 : [폴더]의 디렉토리 색인은 금지되어 있습니다.