1

以下は、ボタンからチェス盤を作成するために使用しているコードです。

from Tkinter import *

for x in xrange(8):
    for y in xrange(8:
        if((x+y)%2 == 0):
            Button(root, bg="white", width=11, height=5).grid(row=y, column=x)
        else:
            Button(root, bg="black", width=11, height=5).grid(row=y, column=x)

個々のボタンのコールバック関数を作成する方法は知っていますが、これらの 64 個のボタンのそれぞれにコールバック関数を実装して、ボタンを押すとグリッド内の位置が返されるようにする方法がわかりません。

4

3 に答える 3

3
def callback(event):
   x,y = event.widget.grid_location()

この例では、正しい方向を示しているはずです。

更新: grid_locationの使用法を明確にするために、私はクイックグーグルを実行し、... SO-post ;-)を見つけました。これは、より直接的な方法で必要なソリューションを正確に提供することで、私を恥ずかしく思います。

grid_info = event.widget.grid_info()
print "row:", grid_info["row"], "column:", grid_info["column"]

したがって、クレジットはブライアンオークリーに行く必要があります;-)そしてこの質問は重複と呼ばれることがあります...

于 2012-11-06T12:22:57.040 に答える
1

各ボタンの x 値と y 値を、ボタンが押されるたびにハンドラー関数を呼び出すことができるラムダにバインドしてみてください。これで、ボタンを押すたびに x と y の位置がわかりました。

def handlebuttonpress(x,y):
  print 'Button x-{0} y-{1} pressed'.format(x,y)

width, height = 8, 8
for x in xrange(width):
  for y in xrange(height):
    if((x+y)%2 == 0):
        Button(root, command=lambda x=x, y=y: handlebuttonpress(x,y), bg="white", width=11, height=5).grid(row=y, column=x)
    else:
        Button(root, command=lambda x=x, y=y: handlebuttonpress(x,y), bg="black", width=11, height=5).grid(row=y, column=x)
于 2012-11-06T12:30:43.363 に答える
0

編集:ボタンごとに異なる機能を必要としないため、@DonQuestionのイベントベースのアプローチの方が好きだと思います。

以下では、元のコードを使用するように調整しました

    master.bind("<Button-1>", self.onclick)

マウスクリックに反応する(使用する代わりにtk.Button(command = ...)


import Tkinter as tk

class ButtonEventBlock(object):
    # http://stackoverflow.com/a/6102759/190597
    def __init__(self, master, names, cols):
        self.names = names
        self.cols = cols
        self.button = []
        for i, name in enumerate(names):
            self.button.append(tk.Button(master, text = name))
            row, col = divmod(i, self.cols)
            self.button[i].grid(sticky = tk.W+tk.E+tk.N+tk.S,
                                row = row, column = col, padx = 1, pady = 1)
        master.bind("<Button-1>", self.onclick)

    def onclick(self, event):
        info = event.widget.grid_info()        
        # print(info)
        # {'rowspan': '1', 'column': '3', 'sticky': 'nesw', 'ipady': '0', 'ipadx':
        # '0', 'columnspan': '1', 'in': <Tkinter.Tk instance at 0xab3d7ec>,
        # 'pady': '1', 'padx': '1', 'row': '0'}
        row, col = [int(info[key]) for key in ['row', 'column']]
        i = self.cols*row + col
        print(row, col, self.names[i])

names = ('One', 'Two', 'Three', 'Four', 'Five',
         'Six', 'Seven', 'Eight', 'Nine', 'Ten')

root = tk.Tk()
ButtonEventBlock(root, names, cols = 5)
root.mainloop()

ここに画像の説明を入力

于 2012-11-06T12:32:49.807 に答える