2015-07-19 46 views
2

我一直在研究一個Python/Tkinter項目,它需要從下面的列表中以編程方式創建按鈕。如何在tkinter中以編程方式將相同的操作關聯到一組按鈕?

當按下某一按鈕時,我想直到另一個按鈕被按下時,在該階段該按鈕將變得"sunken",按鈕點擊第一會成爲'normal'該按鈕成爲"sunken"

到目前爲止,我不知道如何做到這一點,而不必單獨編碼每個按鈕。

理想情況下,relief將設置在press()函數中。

import tkinter 


window = tkinter.Tk() 
window.title("Practice UI") 
window.grid() 

numbers = ["1","2","3","4","5","6","7","8","9"] 

def buttonCreator(labels): 
    n = 0 
    button = [] 
    for x in range(0,3): 
     for y in range(0,3): 
      if n<=len(labels)-1: 
       button.append(tkinter.Button(window, text = labels[n], command = lambda x = labels[n]:press(x))) 
       button[n].grid(row = x, column = y) 
      n +=1 

def press(value): 
    print(value) 

buttonCreator(numbers) 

window.mainloop() 
+1

您遇到什麼問題?看起來您可以創建按鈕,並將命令與每個按鈕相關聯。你不知道該怎麼做?你知道按鈕小部件上的'config'方法嗎? –

+0

對不起,我不清楚。被按下後,我想按鈕變成「凹陷」。然後,一旦下一個按鈕被按下,我就會喜歡該按鈕返回默認狀態'正常'。我無法弄清楚以後如何使用配置方法,因爲單個按鈕沒有標籤? –

回答

1

你可以簡單地返回button,並用它來訪問你的press()按鈕:

import tkinter 

window = tkinter.Tk() 
window.grid() 

# changed to integers so we can loop through the 
# values in press() and use them as indices 
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

def buttonCreator(labels): 
    n = 0 
    button = [] 
    for x in range(0, 3): 
     for y in range(0, 3): 
      if n <= len(labels) - 1: 
       button.append(tkinter.Button(window, text=labels[n], 
              command=lambda x=labels[n]:press(x))) 
       button[n].grid(row=x, column=y) 
      n += 1 
    return button # added a return statement 

def press(value): 
    for x in numbers: 
     # index is x-1 because 1 is in button[0], etc 
     button[x-1]['relief'] = 'sunken' if x == value else 'raised' 

button = buttonCreator(numbers) 
window.mainloop() 
2

您正在描述一組單選按鈕的行爲,因此您應該使用這些按鈕。

便利單選按鈕有一個屬性indicatoron其中

通常一個單選按鈕顯示其指標。如果您將此選項設置爲零,指示器將消失,並且整個小部件將變爲「推 - 推」按鈕,當它被設置時,該按鈕在清除和沉沒時看起來會擡起。您可能想要增加邊界寬度值,以便更容易地查看此類控件的狀態。

因此,當設置爲零時,它確實正好是你的要求。

0

我不知道這是否會在您的系統,但理論上它應該是類似於下面的代碼的東西:

from tkinter import * 


def make_all_normal(buttons): 
    for button in buttons: 
     button.config(relief="raised") # for windows 

def make_sunken(event, buttons): 
    make_all_normal(buttons) 
    event.widget.config(relief="sunken") 


root = Tk() 

buttons = [] 

for i in range(10): 
    b = Button(root, text="Button " + str(i + 1)) 
    buttons.append(b) 
    b.bind("<Button-1>", lambda e: make_sunken(e, buttons)) 
    b.pack(side="top") 

root.mainloop() 

我主要做是在<Button-1>事件綁定一個回調(方法)而不是將方法與按鈕的command屬性相關聯。這很有用,因爲通過傳遞給回調的事件對象,您可以訪問觸發事件的小部件,然後通過該引用對其進行修改。

我已經在Mac OS X和Windows 7上嘗試了這段代碼,但它對Windows 7並不適用,因爲您必須單擊兩次按鈕才能獲得所需的效果,但這很奇怪...

此代碼根本無法用於我嘗試的OS X,但這是使用Mac OS X時的典型問題:對於某些小部件,樣式不可配置。

我注意到OS X上的按鈕的relief屬性的默認值是flat,而Windows的relief屬性的默認值是raised

請注意,如果您有很多按鈕,而不是使所有按鈕正常,這可能是昂貴的,你可以跟蹤某個全局變量或類似的最後點擊按鈕。

0

只是一個例子,我將創建兩個按鈕與你想要的反應:

from Tkinter import * 

win = Tk() 

def press1(): 
    button1["relief"] = "sunken" 
    button2["relief"] = "normal" 
def press2(): 
    button1["relief"] = "normal" 
    button2["relief"] = "sunken" 

button1 = Button(win, text="Button 1", command=press1) 
button2 = Button(win, text="Button 2", command=press2) 

button1.pack() 
button2.pack() 

button1.grid(row=1, column=1) 
button2.grid(row=1, column=2) 

win.mainloop() 

應該工作。第二種方法:

from Tkinter import * 

win = Tk() 

def press(buttonnumber): 
    if buttonnumber==1: 
     button1["relief"] = "sunken" 
     button2["relief"] = "normal" 
    elif buttonnumber==2: 
     button1["relief"] = "normal" 
     button2["relief"] = "sunken" 
    else: 
     raise Exception("No Button Number \"%d\"" % buttonnumber) 

button1 = Button(win, text="Button 1", command=lambda: press(1)) 
button2 = Button(win, text="Button 2", command=lambda: press(2)) 

button1.pack() 
button2.pack() 

button1.grid(row=1, column=1) 
button2.grid(row=1, column=2) 

win.mainloop() 
相關問題