Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
 Аватар для opax
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 21

Передача функции виджета Button

06.11.2011, 13:09. Показов 2985. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, я криворукий ленивый начинающий программист на Python который несмотря на лень всёже погуглил, но так и не нашел решения простой казалось бы проблемы.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from tkinter import*
def button_clicked(x):
    if x['text'] == '':
        x['text'] = 'X'
    elif x['text'] == 'X':
        x['text'] = '0'
    elif x['text'] == '0':
       x['text'] = ''
                
tk=Tk()
tk.title('x-0')
fr=Frame(tk,height=300,width=300)
fr.pack()
fr.pack_propagate(False)
but1=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but1))
but2=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but2))
but3=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but3))
but4=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but4))
but5=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but5))
but6=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but6))
but7=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but7))
but8=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but8))
but9=Button(fr,text='',height=5,width=10,fg='white',bg='grey',command=button_clicked(but9))
 
but1.grid(column=1,row=0)
but2.grid(column=2,row=0)
but3.grid(column=3,row=0)
but4.grid(column=1,row=1)
but5.grid(column=2,row=1)
but6.grid(column=3,row=1)
but7.grid(column=1,row=2)
but8.grid(column=2,row=2)
but9.grid(column=3,row=2)
 
tk.mainloop()
аля тупые крестики-нолики
сделал функцию смены надписи на баттонах. а вот теперь вопрос.. как мне в функцию передать нужный буттон, так чтобы он не заругался?
пробовал делать через
Python
1
but1.bind(<'Button-1'>, button_clicked(but1))
, как эвент, вроде как по клику левой клавиши должен менять ан, нет меняет при запуске и дальше не даёт.
Я знаю что я натупил, подскажите где?
Или уж на матчасть добротную ссылку дайте) заранее спасибо!

Добавлено через 10 минут
может через lambda какнибудь?

Добавлено через 2 часа 9 минут
также пробовал
Python
1
but1.onclick=button_clicked(but1)
тоже самое, при запуске срабатывает и всё. и кликаешь-нифига.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2011, 13:09
Ответы с готовыми решениями:

Чтение URL адресса из окна виджета и открытие его браузером при нажатии кнопки виджета
#Как считать url со строки ввода в виджете что бы потом при нажатии кнопки виджета открыть этот url браузером. from tkinter...

Передача переменной из одного button в другой button
Внутри Button описываю массив short **Arr = new short* ; // 12000 строк в массиве for (int i = 0; i &lt; 12000; i++) { Arr=new short...

Как навести мышку на x,y внутри виджета относительно 0,0 виджета (левого верхнего угла виджета)?
Как навести мышку на x,y внутри виджета относительно 0,0 этого виджета (левого верхнего угла виджета)? Или, как получить координаты x,y...

6
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2011, 17:44
Цитата Сообщение от opax
при запуске срабатывает и всё
потому что вычисляется один раз
на какой эффект ты расчитываешь ?
Цитата Сообщение от opax
Python
1
command=button_clicked(but1))
что значит but1, для чего она туда подаётся ?
0
 Аватар для opax
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 21
06.11.2011, 20:25  [ТС]
мне нужно сделать тупые крестики нолики, чтобы при кликах на 1 из 9 кнопок текст менялся с пусто на Х и с Х на 0 и потом с 0 снова на пусто
я написал функцию которая это делает, но писать 9 одинаковых функций для каждой клавиши с одним и тем же кодом смысла нет, вот я и искал пути чтобы передавать кнопку(её имя, для работы с ней) как аргумент в функцию

Добавлено через 20 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
from tkinter import*
def button_clicked1(event):
    if but1['text'] == '':
        but1['text'] = 'X'
    elif but1['text'] == 'X':
          but1['text'] = '0'
    elif but1['text'] == '0':
          but1['text'] = ''
def button_clicked2(event):
    if but2['text'] == '':
        but2['text'] = 'X'
    elif but2['text'] == 'X':
          but2['text'] = '0'
    elif but2['text'] == '0':
          but2['text'] = ''
def button_clicked3(event):
    if but3['text'] == '':
        but3['text'] = 'X'
    elif but3['text'] == 'X':
          but3['text'] = '0'
    elif but3['text'] == '0':
          but3['text'] = ''
def button_clicked4(event):
    if but4['text'] == '':
        but4['text'] = 'X'
    elif but4['text'] == 'X':
          but4['text'] = '0'
    elif but4['text'] == '0':
          but4['text'] = ''
def button_clicked5(event):
    if but5['text'] == '':
        but5['text'] = 'X'
    elif but5['text'] == 'X':
          but5['text'] = '0'
    elif but5['text'] == '0':
          but5['text'] = ''
def button_clicked6(event):
    if but6['text'] == '':
        but6['text'] = 'X'
    elif but6['text'] == 'X':
          but6['text'] = '0'
    elif but6['text'] == '0':
          but6['text'] = ''
def button_clicked7(event):
    if but7['text'] == '':
        but7['text'] = 'X'
    elif but7['text'] == 'X':
          but7['text'] = '0'
    elif but7['text'] == '0':
          but7['text'] = ''
def button_clicked8(event):
    if but8['text'] == '':
        but8['text'] = 'X'
    elif but8['text'] == 'X':
          but8['text'] = '0'
    elif but8['text'] == '0':
          but8['text'] = ''
def button_clicked9(event):
    if but9['text'] == '':
        but9['text'] = 'X'
    elif but9['text'] == 'X':
          but9['text'] = '0'
    elif but9['text'] == '0':
          but9['text'] = ''
 
          
tk=Tk()
tk.title('x-0')
fr=Frame(tk,height=300,width=300)
fr.pack()
fr.pack_propagate(False)
but1=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
but2=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
but3=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
but4=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
but5=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
but6=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
but7=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
but8=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
but9=Button(fr,text='',height=5,width=10,fg='white',bg='grey')
 
but1.grid(column=1,row=0)
but2.grid(column=2,row=0)
but3.grid(column=3,row=0)
but4.grid(column=1,row=1)
but5.grid(column=2,row=1)
but6.grid(column=3,row=1)
but7.grid(column=1,row=2)
but8.grid(column=2,row=2)
but9.grid(column=3,row=2)
 
but1.bind('<Button-1>',button_clicked1)
but2.bind('<Button-1>',button_clicked2)
but3.bind('<Button-1>',button_clicked3)
but4.bind('<Button-1>',button_clicked4)
but5.bind('<Button-1>',button_clicked5)
but6.bind('<Button-1>',button_clicked6)
but7.bind('<Button-1>',button_clicked7)
but8.bind('<Button-1>',button_clicked8)
but9.bind('<Button-1>',button_clicked9)
 
tk.mainloop()
вот полностью рабочий индусский код) надо его компактнее сделать, но как обращение к 1 функции 9 бутонов наладить пока не разобрался
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2011, 00:27
Python
1
but1.bind('<Button-1>', lambda : button_clicked(1))
Цитата Сообщение от opax
чтобы при кликах на 1 из 9 кнопок текст менялся с пусто на Х и с Х на 0 и потом с 0 снова на пусто
а как ты меняешь уже заполненные клетки ?
0
 Аватар для opax
0 / 0 / 1
Регистрация: 29.03.2010
Сообщений: 21
07.11.2011, 14:51  [ТС]
у передаваемой в функцию кнопки есть атрибут text, который отвечает за надпись на кнопке. просто при нажати выполняется код:

if but['text'] == '':
but['text'] = 'X'
elif but['text'] == 'X':
but['text'] = '0'
elif but['text'] == '0':
but['text'] = ''
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2011, 16:01
не, в смысле, как ты можешь поменять клетку, если в ней уже есть крестик или нолик
можно только заменить их при выигрыше на выделенные каким-нибудь образом
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
07.11.2011, 16:44
Текст (состояние кнопки) - через связанную переменную. Процедура обработки события нажатия на эту кнопку - через замыкание:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python3
 
from tkinter import *
from tkinter import ttk
 
def construct_callback(var_idx):
    def callback(*args):
        var = vars[var_idx].get()
 
        if var == '':
            vars[var_idx].set('X')
        elif var == 'X':
            vars[var_idx].set('0')
        else:
            vars[var_idx].set('')
 
 
    return callback
 
 
root = Tk()
root.title('X-0')
 
vars = [StringVar(value='') for _ in range(9)]
 
mainframe = ttk.Frame(root, padding=(3, 3, 3, 3))
mainframe.grid(column=0, row=0)
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
 
for i in range(9):
    ttk.Button(mainframe, textvariable=vars[i],
               command=construct_callback(i)).grid(row=i % 3,
                                                   column=(i // 3) % 3,
                                                   padx=5, pady=5)
 
root.mainloop()
Но менять состояние однажды нажатой кнопки не стоит, соглашусь с accept

Не по теме:

PS. Сам Tkinter (Tk) не знаю, читаю этот tutorial вот уже как полчаса

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2011, 16:44
Помогаю со студенческими работами здесь

Неверная передача цвета полупрозрачного виджета поверх opengl
#ifndef FORM_H #define FORM_H #include &lt;QOpenGLWidget&gt; #include &lt;QOpenGLFunctions_3_0&gt; class Form : public QOpenGLWidget,...

Передача значения в БД из <button>
Всем привет. Прошу помощи в таком вопросе, т.к goggle не всех спасает... Не могу понять как можно обработать значение кнопки. Т.е при...

Передача значения в БД из <button>
Всем привет. Прошу помощи в таком вопросе, т.к goggle не всех спасает... Не могу понять как можно обработать значение кнопки. Т.е при...

Передача информации из textbox в button
У меня считывается массив из файла в textbox. 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 Как каждый...

Передача ссылки из textbox в button
Всем привет, курсовая, и надо сделать программу для скачивания видео с ютуба. Как передать ссылку из textbox в button, и чтоб по нажатию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru