2014-05-14 1 views
0

다음 코드에서 textvariable "die"를 정의해야하는 위치와 방법을 반복적으로 시도하고 이해하지 못했습니다. 주석 처리 된 행은 값 할당을 시도한 곳이지만 다양한 값 또는 이름 오류가 계속 발생하기 때문에 값을 올바르게 초기화하는 방법을 알지 못합니다. tkinter의 자체 참조 구현에서 'textvariable'을 정의하는 데 문제가 있습니다.

from random import * 
from tkinter import * 
from tkinter import ttk 
import tkinter as tk 

#die = StringVar() # 1 

def roll (int): 
    try: 
     die.set(randrange(1,int)) 
    except ValueError: 
     pass 

class Application(ttk.Frame): 

    #die = StringVar() # 2 

    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     #self.die = StringVar() # 3 
     self.createWidgets() 

    def createWidgets(self): 
     #self.die = StringVar() # 4 
     self.d_twoButton = ttk.Button(self, text='d2', command=roll(2)).grid() 
     self.d_threeButton = ttk.Button(self, text='d3', command=roll(3)).grid() 
     self.d_fourButton = ttk.Button(self, text='d4', command=roll(4)).grid() 
     self.d_sixButton = ttk.Button(self, text='d6', command=roll(6)).grid() 
     self.d_eightButton = ttk.Button(self, text='d8', command=roll(8)).grid() 
     self.d_tenButton = ttk.Button(self, text='d10', command=roll(10)).grid() 
     self.d_twelveButton = ttk.Button(self, text='d12', command=roll(12)).grid() 
     self.d_twentyButton = ttk.Button(self, text='d20', command=roll(20)).grid() 
     self.d_onehundredButton = ttk.Button(self, text='d100', command=roll(100)).grid() 
     self.resultLabel = ttk.Label(self, textvariable=die) 
     self.resultLabel.grid()   

app = Application()      
app.master.title('Die Roller') 
#app.die = StringVar() # 5 
app.mainloop() 

(나는 쉽게 식별하면 textVariable 및 stringval의 태그를 추가하려했지만, 나는 아직없는 기준으로 생각합니다. 누구든지이 게시물에 같은 태그를 추가 할 수 있다면, 그렇게 주시기 바랍니다.)

+0

당신의 버튼을 모두 클래스의 방법으로 roll을 사용


대체 구현 변수들 ('self.d_twoButton' 등)은'stat'에서'grid'를 호출하기 때문에'None'으로 설정됩니다 위젯을 만들 위치를 지정하십시오. 위젯의 생성과 레이아웃을 분리하거나 변수를 제거해야합니다. –

답변

1

아마도 # 3이 가장 좋은 장소 일 것입니다. 하지만 몇 가지 추가 수정이 필요합니다.

  • 의 앱 객체를 명시 적으로 참조해야 die 속성에 액세스 할 수 있습니다. 또는 roll이 Application 클래스의 메서드 여야합니다. 두 번째 코드 블록을 참조하십시오.
  • command 매개 변수는 호출 할 함수에 인수를 제공하는 경우 lambda으로 묶어야합니다.
  • 선택 사항 : None이고 모두 어쨌든 어디에서나 사용하지 않기 때문에 모든 self.d_someNumberButton = 할당 비트를 제거하십시오. (힌트 : my_thing = Button()은 버튼으로 my_thing하게 my_thing = Button().grid()Nonemy_thing한다..) 원래 코드에 가장 적은 수정을

구현 :

from random import * 
from tkinter import * 
from tkinter import ttk 
import tkinter as tk 

#die = StringVar() # 1 

def roll (int): 
    try: 
     app.die.set(randrange(1,int)) 
    except ValueError: 
     pass 

class Application(ttk.Frame): 

    #die = StringVar() # 2 

    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     self.die = StringVar() # 3 
     self.createWidgets() 

    def createWidgets(self): 
     #self.die = StringVar() # 4 
     self.d_twoButton = ttk.Button(self, text='d2', command=lambda: roll(2)).grid() 
     self.d_threeButton = ttk.Button(self, text='d3', command=lambda: roll(3)).grid() 
     self.d_fourButton = ttk.Button(self, text='d4', command=lambda: roll(4)).grid() 
     self.d_sixButton = ttk.Button(self, text='d6', command=lambda: roll(6)).grid() 
     self.d_eightButton = ttk.Button(self, text='d8', command=lambda: roll(8)).grid() 
     self.d_tenButton = ttk.Button(self, text='d10', command=lambda: roll(10)).grid() 
     self.d_twelveButton = ttk.Button(self, text='d12', command=lambda: roll(12)).grid() 
     self.d_twentyButton = ttk.Button(self, text='d20', command=lambda: roll(20)).grid() 
     self.d_onehundredButton = ttk.Button(self, text='d100', command=lambda: roll(100)).grid() 
     self.resultLabel = ttk.Label(self, textvariable=self.die) 
     self.resultLabel.grid()   

app = Application()      
app.master.title('Die Roller') 
#app.die = StringVar() # 5 
app.mainloop() 

결과 :

enter image description here

여기에서 방금 "d100"버튼을 클릭했는데 숫자가 성공적으로 표시되었습니다. 예상 범위.

from random import * 
from tkinter import * 
from tkinter import ttk 
import tkinter as tk 

class Application(ttk.Frame): 
    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     self.die = StringVar() 
     self.createWidgets() 

    def createWidgets(self): 
     ttk.Button(self, text='d2', command=lambda: self.roll(2)).grid() 
     ttk.Button(self, text='d3', command=lambda: self.roll(3)).grid() 
     ttk.Button(self, text='d4', command=lambda: self.roll(4)).grid() 
     ttk.Button(self, text='d6', command=lambda: self.roll(6)).grid() 
     ttk.Button(self, text='d8', command=lambda: self.roll(8)).grid() 
     ttk.Button(self, text='d10', command=lambda: self.roll(10)).grid() 
     ttk.Button(self, text='d12', command=lambda: self.roll(12)).grid() 
     ttk.Button(self, text='d20', command=lambda: self.roll(20)).grid() 
     ttk.Button(self, text='d100', command=lambda: self.roll(100)).grid() 
     self.resultLabel = ttk.Label(self, textvariable=self.die) 
     self.resultLabel.grid()   

    def roll(self, max_value): 
     app.die.set(randrange(1,max_value)) 

app = Application()      
app.master.title('Die Roller') 
app.mainloop() 

대안 대안 구현 for 루프를 사용하는 버튼을 만들 :

from random import * 
from tkinter import * 
from tkinter import ttk 
import tkinter as tk 

class Application(ttk.Frame): 
    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     self.die = StringVar() 
     self.createWidgets() 

    def createWidgets(self): 
     for num_sides in [2, 3, 4, 6, 8, 10, 12, 20, 100]: 
      ttk.Button(self, text="d{}".format(num_sides), command=lambda value=num_sides: self.roll(value)).grid() 
     self.resultLabel = ttk.Label(self, textvariable=self.die) 
     self.resultLabel.grid()   

    def roll(self, max_value): 
     app.die.set(randrange(1,max_value)) 

app = Application()      
app.master.title('Die Roller') 
app.mainloop() 
+0

감사합니다. 변수를 초기화 할 때 여러 단계가 빠져 있음을 알고있었습니다. 당신의 대안은 버튼을 동적으로 생성하는 것에 대해 궁금해했기 때문에 나에게도 훌륭한 자료입니다. 그러나 간단한 예제를 먼저 배워야한다고 생각했습니다. –

관련 문제