List 객체에 Button 객체를 삽입하는 문제가 발생했습니다.
Python-Tkinter, 버튼 목록
샘플 작업 .. 내가 달성하기 위해 노력하고있어하는 것은 실제로 달성 할 수 있을지는 모르겠지만 여기있다 : 당신이 눈치
from tkinter import *
class Main(Frame):
def __init__(self, master = None):
Frame.__init__(self, master)
self.pack(fill = 'both', expand = True)
# General purpose variables ----------
self.isButtonSelected = False
self.isButton_A_Selected = False # controll boolean
self.isButton_B_Selected = False
self.isButton_C_Selected = False
self.isButton_D_Selected = False
# Layers ----------
self.background = Frame(self)
# Buttons ----------
self.button_A = Button(self.background, text = "A", bg = 'white', command = self.selectButton_A)
self.button_B = Button(self.background, text = "B", bg = 'white', command = self.selectButton_B)
self.button_C = Button(self.background, text = "C", bg = 'white', command = self.selectButton_C)
self.button_D = Button(self.background, text = "D", bg = 'white', command = self.selectButton_D)
# Packs ----------
#layers
self.background.pack(fill = 'both', expand = True)
#buttons
btnPackPrefix = {'side' : 'left', 'fill' : 'both', 'expand' : 'True'}
self.button_A.pack(btnPackPrefix)
self.button_B.pack(btnPackPrefix)
self.button_C.pack(btnPackPrefix)
self.button_D.pack(btnPackPrefix)
def selectButton_A(self):
'''The idea here is similar to radiobuttons.
Click to select. Click same to deselect.
Click other to deselect old and select new.
Only one button can be selected at a time.
-repeated for all similar methods.'''
if self.isButtonSelected == False: # click-select
self.button_A.config(bg = 'green')
self.isButtonSelected = True
self.isButton_A_Selected = True
else:
if self.isButton_A_Selected: # click-deselect
self.resetButtons()
self.isButtonSelected = False
else: # deselect other and select this
self.resetButtons()
self.button_A.config(bg = 'green')
self.isButtonSelected = True
self.isButton_A_Selected = True
def selectButton_B(self):
if self.isButtonSelected == False:
self.button_B.config(bg = 'green')
self.isButtonSelected = True
self.isButton_B_Selected = True
else:
if self.isButton_B_Selected:
self.resetButtons()
self.isButtonSelected = False
else:
self.resetButtons()
self.button_B.config(bg = 'green')
self.isButtonSelected = True
self.isButton_B_Selected = True
def selectButton_C(self):
if self.isButtonSelected == False:
self.button_C.config(bg = 'green')
self.isButtonSelected = True
self.isButton_C_Selected = True
else:
if self.isButton_C_Selected:
self.resetButtons()
self.isButtonSelected = False
else:
self.resetButtons()
self.button_C.config(bg = 'green')
self.isButtonSelected = True
self.isButton_C_Selected = True
def selectButton_D(self):
if self.isButtonSelected == False:
self.button_D.config(bg = 'green')
self.isButtonSelected = True
self.isButton_D_Selected = True
else:
if self.isButton_D_Selected:
self.resetButtons()
self.isButtonSelected = False
else:
self.resetButtons()
self.button_D.config(bg = 'green')
self.isButtonSelected = True
self.isButton_D_Selected = True
def resetButtons(self):
'''this pretty much resets all buttons and controll booleans
to their default state'''
#A
self.button_A.config(bg = 'white') # paint button white
self.isButton_A_Selected = False # controll boolean reset
#B
self.button_B.config(bg = 'white')
self.isButton_B_Selected = False
#C
self.button_C.config(bg = 'white')
self.isButton_C_Selected = False
#D
self.button_D.config(bg = 'white')
self.isButton_D_Selected = False
def run_Application():
app = Main()
app.master.geometry('200x50')
app.mainloop()
run_Application()
내 코드는 저작권법과 많이있다 각 내용이 변경된 붙여 넣은 스 니펫
그래서 어떻게 든 더 짧게 만들 필요가 있습니다.이 모든 동작을 제어하는 1 개의 함수가 필요합니다.
이 둘은 비슷하기 때문에 마찬가지입니다.
나는 이것을 생각해 냈습니다.
작동하지 샘플 :
from tkinter import *
class Main(Frame):
def __init__(self, master = None):
Frame.__init__(self, master)
self.pack(fill = 'both', expand = True)
# General purpose variables ----------
self.isButtonSelected = False
self.isButton_A_Selected = False # controll boolean
self.isButton_B_Selected = False
self.isButton_C_Selected = False
self.isButton_D_Selected = False
# Layers ----------
self.background = Frame(self)
# Buttons ----------
self.button_A = Button(self.background, text = "A", bg = 'white', command = self.selectButton(0)) # apparently this doesn't work...
self.button_B = Button(self.background, text = "B", bg = 'white', command = self.selectButton(1))
self.button_C = Button(self.background, text = "C", bg = 'white', command = self.selectButton(2))
self.button_D = Button(self.background, text = "D", bg = 'white', command = self.selectButton(3))
# Packs ----------
#layers
self.background.pack(fill = 'both', expand = True)
#buttons
btnPackPrefix = {'side' : 'left', 'fill' : 'both', 'expand' : 'True'}
self.button_A.pack(btnPackPrefix)
self.button_B.pack(btnPackPrefix)
self.button_C.pack(btnPackPrefix)
self.button_D.pack(btnPackPrefix)
def selectButton(self, i = None):
'''The idea here is similar to radiobuttons.
Click to select. Click same to deselect.
Click other to deselect old and select new.
Only one button can be selected at a time.
-do that only on objects
at [i]. 'i' is given from the button command'''
global buttons, btn_bools
buttons = [self.button_A, self.button_B,
self.button_C, self.button_D] # list buttons. # Raises error. It seems that Button objects cannot be listed
btn_bools = [self.isButton_A_Selected, self.isButton_B_Selected,
self.isButton_C_Selected, self.isButton_D_Selected] # list contoll booleans
if self.isButtonSelected == False: # click-select
self.buttons[i].config(bg = 'green')
self.isButtonSelected = True
self.btn_bools[i] = True
else:
if self.isButton_A_Selected: # click-deselect
self.resetButtons()
self.isButtonSelected = False
else: # deselect other and select this
self.resetButtons()
self.buttons[i].config(bg = 'green')
self.isButtonSelected = True
self.btn_bools[i] = True
def resetButtons(self):
'''iterate through all buttons/controll booleans
and reset to their default state'''
for b in range(len(buttons)):
buttons[b].config(bg = 'white')
for bb in range(len(btn_bools)):
btn_bools[bb] = False
def run_Application():
app = Main()
app.master.geometry('200x50')
app.mainloop()
run_Application()
가 나는 Int 인 속성을 포함하고
그것을 완벽하게 일 '간단한'클래스와 유사한 방법을 테스트하기 위해 노력!
오류 보고서에서 불가능한 항목이 아니라면 그 목록 버튼은 좋은 생각이 아닙니다.
나는 어떤 예나 비슷한 문제에 대해서도 구글을 많이 찾았지만, 그렇지 않았다.
좋은 결과를 얻는다.
나는 파이썬에서 포인터 구현을 검색했고
도 혼란 스럽다.
단추를 가리키는 변수를 저장할 수 있는지 확인하려고했지만 그 결과가 같다고 생각합니다. List는 개체를 단추로 읽고
발생합니다. 오류가 발생합니다.
내 질문은 다음과 같습니다.
1. 어떻게해도 될 수 있습니까? (첫 번째 코드 샘플을 상당히 짧게합니다.)
2. 목록 정보 버튼 또는 위젯 일반 : 수행 할 수 있다면 어떻게? 그렇지 않다면 왜?
3. 두 번째 코드 샘플에서 내 함수에 필요한 'i'인수
을 포함하는 버튼 명령이 필요합니다. 어떻게 입력 할 수 있습니까? 그냥 (i)을 더하는 것이 효과가없는 것 같습니다.
미리 감사드립니다.
아 내가 볼이 이제 버튼이 생성 될 수 있습니다, 그리고 만약 당신이 좋아하면 당신은 목록에 할당 할 수 있습니다 . 나는 아직 _lambdas_를 사용하지 않았기 때문에 독서를 시작할 때가되었습니다! 고마워요! 지금 큰 일을하고 있습니다! –