아마도 # 3이 가장 좋은 장소 일 것입니다. 하지만 몇 가지 추가 수정이 필요합니다.
- 의 앱 객체를 명시 적으로 참조해야 die 속성에 액세스 할 수 있습니다. 또는
roll
이 Application 클래스의 메서드 여야합니다. 두 번째 코드 블록을 참조하십시오.
command
매개 변수는 호출 할 함수에 인수를 제공하는 경우 lambda
으로 묶어야합니다.
- 선택 사항 :
None
이고 모두 어쨌든 어디에서나 사용하지 않기 때문에 모든 self.d_someNumberButton =
할당 비트를 제거하십시오. (힌트 : my_thing = Button()
은 버튼으로 my_thing
하게 my_thing = Button().grid()
이 None
에 my_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()
결과 :
여기에서 방금 "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()
당신의 버튼을 모두 클래스의 방법으로
roll
을 사용대체 구현 변수들 ('self.d_twoButton' 등)은'stat'에서'grid'를 호출하기 때문에'None'으로 설정됩니다 위젯을 만들 위치를 지정하십시오. 위젯의 생성과 레이아웃을 분리하거나 변수를 제거해야합니다. –