2016-12-28 6 views
0

Я пытаюсь написать программу noughts and crosses и хочу, чтобы это было при нажатии кнопки, кнопка исчезает, и на ее месте появляется метка, однако, когда я запускаю код, как показано ниже, кнопки исчезают, но метки не отображаются, любая помощь будет оценена, и я извиняюсь, если это дублированный вопрос, но при поиске и ответе я не смог найти подходящую нить.Как получить ярлык, появляющийся при нажатии кнопки в python 3's tkinter

import sys 

from tkinter import * 

def hide_me(event): 
    event.widget.place_forget() 

def play(row, column): 
    holdx = int() 
    holdy = int() 
    if row == 'A': 
     holdx = 100 
    elif row == 'B': 
     holdx = 200 
    elif row == 'C': 
     holdx = 300 
    else: 
     print('FATAL ERROR') 
    if column == 1: 
     holdy = 100 
    elif column == 2: 
     holdy = 200 
    elif column == 3: 
     holdy = 300 
    else: 
     print('FATAL ERROR') 
    placement = Label(text='HI').place(x=holdx,y=holdy) 

mGui = Tk() 

mGui.geometry('400x400') 

mGui.configure(bg='#FFFFFF') 

mGui.title('Noughts and Crosses') 

mLabel= Label(text='Noughts and Crosses', bg='#FFFFFF').place(x=160,y = 50) 

A1 = Button(mGui, text='A1', command = lambda: play('A', 2)) 

A1.bind('<Button-1>', hide_me) 

A1.place(x=100,y=100) 

A2 = Button(mGui, text='A2', command = lambda: play('A', 2)) 

A2.bind('<Button-1>', hide_me) 

A2.place(x=200,y=100) 

A3 = Button(mGui, text='A3', command = lambda: play('A', 3)) 

A3.bind('<Button-1>', hide_me) 

A3.place(x=300,y=100) 

B1 = Button(mGui, text='B1', command = lambda: play('B', 1)) 

B1.bind('<Button-1>', hide_me) 

B1.place(x=100,y=200) 

B2 = Button(mGui, text='B2', command = lambda: play('B', 2)) 

B2.bind('<Button-1>', hide_me) 

B2.place(x=200,y=200) 

B3 = Button(mGui, text='B3', command = lambda: play('B', 3)) 

B3.bind('<Button-1>', hide_me) 

B3.place(x=300,y=200) 

C1 = Button(mGui, text='C1', command = lambda: play('C', 1)) 

C1.bind('<Button-1>', hide_me) 

C1.place(x=100,y=300) 

C2 = Button(mGui, text='C2', command = lambda: play('C', 2)) 

C2.bind('<Button-1>', hide_me) 

C2.place(x=200,y=300) 

C3 = Button(mGui, text='C3', command = lambda: play('C', 3)) 

C3.bind('<Button-1>', hide_me) 

C3.place(x=300,y=300) 

mGui.mainloop() 

Спасибо заранее всем, кто отвечает на мой вопрос.

+0

вам нужно использовать 'stringVar' и установить' переменная = myStringVariable' вместо 'текста = blah' –

+1

вам не нужно' BIND ('', ...) '-' Button' имеет 'command =', и вы можете назначить функцию с двумя действиями - 'play' и' hide_me' – furas

+1

'bind ('', ...)' щёлкните мышью и не отправляйте кнопку, чтобы она не выполнялась функция, назначенная командой 'command ='. Используйте только 'command =' и т. Д. 'play ('C', 2, C2)', чтобы скрыть 'C2' – furas

ответ

1

Проблема в том, что вы используете bind('<Button-1>', ...) улавливают нажмите кнопку и не выполняет функции, назначенной с command=

Используйте только command= и отправить виджет play()

import tkinter as tk 

# --- functions --- 

def play(x, y, widget): 

    widget.place_forget() 

    l = tk.Label(root, text='HI') 
    l.place(x=x,y=y) 

# --- main --- 

root = tk.Tk() 
root.geometry('400x400') 
root.configure(bg='#FFFFFF') 
root.title('Noughts and Crosses') 

l = tk.Label(text='Noughts and Crosses', bg='#FFFFFF') 
l.place(x=160,y = 50) 

for r, row in enumerate(('A', 'B', 'C'), 1): 
    for c, col in enumerate(('1', '2', '3'), 1): 
     name = row + col 
     x = c*100 
     y = r*100 
     b = Button(root, text=name) 
     b['command'] = lambda x0=x,y0=y,b0=b: play(x0, y0, b0) 
     b.place(x=x, y=y) 

root.mainloop() 

Я использую for цикл, чтобы сделать его проще но lambda используется в for необходимо x0=x,y0=y,b0=b правильно отправить аргументы в play

lambda x0=x,y0=y,b0=b: play(x0, y0, b0) 

КСТАТИ: если вы используете

var = Widget(...).place(...) 
var = Widget(...).grid(...) 
var = Widget(...).pack(...) 

затем присвоить None к var, потому что place()/grid()/pack() возвращается None.

Вы должны сделать это в два этапа

var = Widget(...) 
var.place(...) 

var = Widget(...) 
var.grid(...) 

var = Widget(...) 
var.pack(...) 

или, если вам не нужно var

Widget(...).place(...) 
Widget(...).grid(...) 
Widget(...).pack(...) 
0

Замена одной кнопки с меткой легко. Чуть сложнее заменить любую из нескольких кнопок этикеткой. Для этого требуется упаковка вместе информации, необходимой для доступа к определенной кнопке с общей функцией замены.

import tkinter as tk 
root = tk.Tk() 

def replace_at(i,j): 
    items[i][j].grid_forget() 
    label = tk.Label(root, text='Label {}, {}'.format(i,j)) 
    label.grid(row=i, column=j) 
    items[i][j] = label 

items = [] 
for i in range(3): 
    row = [] 
    for j in range(3): 
     button = tk.Button(root, text='Button {}, {}'.format(i,j), 
          command=lambda i=i, j=j: replace_at(i,j)) 
     button.grid(row=i, column=j) 
     row.append(button) 
    items.append(row) 

root.mainloop()