2017-11-22 4 views
0

나는 linkedlist를 Python으로 구현했으며 모든 노드에 대해 Tkinter 창에 레이블이 필요합니다. 문제는 해당 노드 데이터가 변경 될 때 레이블을 업데이트하는 방법을 모른다는 것입니다.Tkinter 레이블 자체 업데이트

현재 모든 노드와 기본 "데이터 없음"상태의 데이터를 표시하는 창에이 코드가 있습니다. 또한 코멘트에 지적

def interface(self): 
     Window = Tk() 
     Row = 0 
     current_node = self.get_top_of_list() 
     while current_node is not None: 
      Label(Window, text = current_node).grid(row = Row, column = 0) 
      Label(Window, text = current_node.data).grid(row = Row, column = 1)  
      current_node = current_node.next_node 
      Row +=1 
     mainloop() 
+1

'Labelv'는'textvariab '과 함께'StringVar'을 사용하면 텍스트가 자동으로 바뀝니다. le ='그리고 당신은'StringVar'에서 텍스트를 변경합니다. 당신은 노드 안의'Label' 또는'StringVar'을 유지할 수 있고 노드의 값을 변경할 때 노드는 그것을 변경할 수 있습니다. Linkedlist는 라벨을 자동으로 업데이트 할 수 없으므로 라벨을위한 기능을 작성해야합니다. – furas

+0

계약자 : [옵저버 패턴] (https://en.wikipedia.org/wiki/Observer_pattern)을 참조하십시오. Node는 "subject"('Observable')이고'Label' 또는'StringVar'는 "observer"('Observer') 일 수 있습니다. – furas

+0

다른 방법은'root.after'를 사용하여 노드에서 모든 데이터를 가져 와서 레이블을 업데이트하는 함수를 실행하는 것입니다. – furas

답변

1

furas으로 다시 라벨 객체를 참조하지 않고, textvariable에 할당 된 객체를 수정할 수 있도록 라벨 위젯은 항상 그 textvariable 표시됩니다.

나중에 변수 클래스 객체를 보유 할 dataLabel 속성을 추가하고 싶습니다.

class Node: 
    def __init__(self, data): 
     self.data = data 
     self.next_node = None 
     self.dataLabel = None 

다음에 self.dataLabel을 그 변수 클래스 객체를 할당 내 interface 방법에 내 라벨의 textvariable :

def interface(self): 
    Window = Tk() 
    Row = 0 
    current_node = self.get_top_of_list() 
    while current_node is not None: 
     current_node.dataLabel = StringVar() #assuming from Window tkinter is imported as wildcard 
     current.node.dataLabel.set(current_node.data) 
     Label(Window, textvariable = current_node.dataLabel).grid(row = Row, column = 0) 

     current_node = current_node.next_node 
     Row +=1 
    mainloop() 

유사한 목적뿐만 아니라 속성 next_node 생성 할 수 있습니다. 이 Labeltextvariable=StringVar를 사용하고 StringVar에서 텍스트를 변경하는 경우

+0

tkinter가 초기화되지 않았기 때문에 tkinter.StringVar()의 tkinter가 인식되지 않습니다. 여기에 StringVar가 맞습니까? –

+0

@JoeBlogs 아니요, 잘못되었습니다. 'Tk() '뒤에 올 필요가 있습니다. – Nae

+0

@JoeBlogs 반영하기 위해 답을 업데이트했습니다. – Nae

0

Label가 자동으로 텍스트를 변경합니다.

Linkedlist에서 레이블을 자동으로 업데이트 할 수 없습니다. 레이블을 자동으로 업데이트 할 수는 없습니다. 기능을 작성해야합니다.

당신은 당신이 노드에서 값을 변경할 때 Label 또는 StringVar에서 값을 변경할 수있는 노드와 노드 내부 Label 또는 StringVar에 대한 액세스를 유지할 수 있습니다.

Observer Pattern을 참조하십시오. StringVar/IntVar/otherVar 사용 패턴 관찰자 : Node는 "관찰자"가 될 수 BTW (class Observer)

"대상"(class Observable) 및 Label 또는 StringVar 수 있습니다. StringVar은 "제목"이고 StringVar ("관찰자"임)에 기능을 할당하려면 StringVar.trace()을 사용하고 StringVar으로 값을 변경할 때 StringVar이이 기능을 자동으로 실행합니다.

effbot.org에 더 : The Variable Classes (BooleanVar, DoubleVar, IntVar, StringVar)


다른 방법은 모든 노드에서 데이터 및 업데이트 Labels을 얻을 것이다 기능을 실행 root.after을 사용하는 것입니다

현재 시간을 표시 after()를 사용

간단한 예

import tkinter as tk 
from datetime import datetime 

# --- functions --- 

def update_time(): 
    # get current date & time as text 
    current = datetime.now().strftime('%Y.%m.%d %H:%M:%S') 

    # update label with current date and time 
    label['text'] = current 

    # run update_time again after 1000ms (1s) 
    root.after(1000, update_time) 

# --- main --- 

root = tk.Tk() 

# create Label without text - update_time will set text 
label = tk.Label(root) 
label.pack() 

# run update_time first time 
update_time() 

root.mainloop() 
관련 문제