Найти - Пользователи
Полная версия: Buttons
Начало » GUI » Buttons
1 2
Ilya
Почему я не вижу 9 ожидаемых кнопок!?
# -*- coding: utf-8 -*-
from tkinter import *
root = Tk()
root.geometry("342x345")
root.resizable(False, False)
name=["a","b","c","d","e","f","g","h","i"]
def btns():
    for i in range(8):
        ris=Button(root, widtn=13, height=5, bg="green", text=name)
        for ro in range(3):
            for co in range(3):
                ris[i].grid(row=ro, column=co)
    
btns()
root.mainloop()
4kpt_II
Ох и нарубили.

# coding: utf-8
#
from tkinter import *
root = Tk()
root.geometry("342x345")
root.resizable(False, False)
name=["a","b","c","d","e","f","g","h","i"]
def btns():
    for ro in range(3):
        for co in range(3):
            ris=Button(root, width=13, height=5, bg="green", text=name.pop(0))
            ris.grid(row=ro, column=co)
btns()
#
root.mainloop()

P.S. Никогда не делайте

from tkinter import*

Никогда!!!

P.S.S. Будут впросы - пишите…
Ilya
Дело в том, что мне необходимо сохранить переменную “i”, так как она используется в комманде command=lambda:click(ris,i).
4kpt_II
Нет. Сохранять нет необходимости.

# coding: utf-8
#
from Tkinter import *
def callback(event):
    print event.widget["text"]
#
root = Tk()
root.geometry("342x345")
root.resizable(False, False)
name=["a","b","c","d","e","f","g","h","i"]
def btns():
    for ro in range(3):
        for co in range(3):
            ris=Button(root, width=13, height=5, bg="green", text=name.pop(0))
            ris.grid(row=ro, column=co)
            ris.bind("<Button-1>", callback)
btns()
#
root.mainloop()

Хотя, если очень нравиться костылить, то

# coding: utf-8
#
from Tkinter import *
#
def callback(name):
    print name
#
root = Tk()
root.geometry("342x345")
root.resizable(False, False)
name=["a","b","c","d","e","f","g","h","i"]
def btns():
    for ro in range(3):
        for co in range(3):
            text = name.pop(0)
            ris=Button(root, width=13, height=5, bg="green", text=text)
            ris["command"] = lambda text=text: callback(text)
            ris.grid(row=ro, column=co)
#
btns()
#
root.mainloop()

P.S. Будут вопросы - пишите…
Ilya
Можете пояснить, что есть lambda?
4kpt_II
Анонимная функция. Проще почитать у М. Лутца. Я не смогу так объяснить как он
Она просто будет вызываться позднее. Так проще для понимания.

Если же просто связать с callback и написать

ris["command"] = callback(text)

то в этом случае Вы свяжете обработчик событий (command) не с функцией, а с ее результатом. А результатом функции callback является None. Соответсвенно программа работать не будет. А вот lambda позволяет создать “запоздалую функцию”, которая будет вызвана только тогда, когда наступит событие.
Я немножно утрирую, но для упрощения понимания.

Но я все равно написал, что второй код не есть хорошо. Читабельность падает. Появляется дополнительный аргументи и усложняется код. Поэтому лучше использовать первый вариант.

P.S. Будут вопросы - пишите…
Ilya
Мне-таки необходимо сохранить “i”. Моя функция клик зависит от button и num, где button- само название кнопки, num- ее номер.
4kpt_II
Я вас не понимаю вообще. Что значит “сохранить”? На диск? Вы код, который я дал выполняли?
Хотите передать позицию кнопки в общем списке функцию обработчик? Или что?
Ilya
Я хочу, чтоб выполнялась эта функция
def click(button, num):
    global numButton
    if num not in numButton:
        global XO
        question()
        if XO == 1:
            XO = 2
        else:
            
            XO = 1
        numButton.append(num)
        logik()
field = [0, 0, 0, 0, 0, 0, 0, 0, 0] #список значений 1 или 2
XO = 1#крестик - 1, нолик - 2
numButton = [] #список нажатых кнопок
#logik()- проверка на выигрыш, проигрыш, ничью
4kpt_II
Японский городовой. Это что за … ?
Опишите логику программы. Я помогу построить конструктор.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB