Уведомления

Группа в Telegram: @pythonsu

#1 Май 27, 2014 17:35:22

Ilya
Зарегистрирован: 2014-05-25
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Buttons

Почему я не вижу 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()

Офлайн

#2 Май 27, 2014 18:03:20

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Buttons

Ох и нарубили.

# 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. Будут впросы - пишите…

Офлайн

#3 Май 27, 2014 18:26:28

Ilya
Зарегистрирован: 2014-05-25
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Buttons

Дело в том, что мне необходимо сохранить переменную “i”, так как она используется в комманде command=lambda:click(ris,i).

Офлайн

#4 Май 27, 2014 18:31:43

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Buttons

Нет. Сохранять нет необходимости.

# 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. Будут вопросы - пишите…

Офлайн

#5 Май 27, 2014 18:39:42

Ilya
Зарегистрирован: 2014-05-25
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Buttons

Можете пояснить, что есть lambda?

Офлайн

#6 Май 27, 2014 18:48:23

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Buttons

Анонимная функция. Проще почитать у М. Лутца. Я не смогу так объяснить как он
Она просто будет вызываться позднее. Так проще для понимания.

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

ris["command"] = callback(text)

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

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

P.S. Будут вопросы - пишите…

Офлайн

#7 Май 27, 2014 21:26:07

Ilya
Зарегистрирован: 2014-05-25
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Buttons

Мне-таки необходимо сохранить “i”. Моя функция клик зависит от button и num, где button- само название кнопки, num- ее номер.

Офлайн

#8 Май 27, 2014 21:38:56

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Buttons

Я вас не понимаю вообще. Что значит “сохранить”? На диск? Вы код, который я дал выполняли?
Хотите передать позицию кнопки в общем списке функцию обработчик? Или что?

Офлайн

#9 Май 27, 2014 21:44:52

Ilya
Зарегистрирован: 2014-05-25
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Buttons

Я хочу, чтоб выполнялась эта функция

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()- проверка на выигрыш, проигрыш, ничью

Офлайн

#10 Май 27, 2014 21:54:05

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Buttons

Японский городовой. Это что за … ?
Опишите логику программы. Я помогу построить конструктор.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version