Как ввести номер в Entry с помощью кнопки в Tkinter - PullRequest
0 голосов
/ 25 мая 2018

Я хочу добавить цифры (только 4 цифры) для ввода с помощью кнопки в tkinter.Я попробовал этот код, но он не работает.Мне нужны некоторые предложения.

import tkinter as tk
win = tk.Tk()

var = tk.StringVar()
var_entry = tk.Entry(win,text='var',textvariable=var)

def handle_button(event):
    return var.insert(0,4)

def window():
    global win
    var_entry.grid(row =1 ,column =2)

    button1 = tk.Button(win,text = '1' ,textvariable = 1)
    button1.bind("<Button-1>", handle_button)
    button1.grid(row = 2 , column = 0)
    # similarly I defined all the buttons.


windows()
win.mainloop()

Отображаемая ошибка:

AttributeError: у объекта 'StringVar' нет атрибута 'insert'

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я попробовал это, и это также сработало.

import tkinter as tk
win = tk.Tk()

var = tk.StringVar()
var_entry = tk.Entry(win,text='var',textvariable=var)
var_entry.grid()

def handle_button(event):
    button_arg = event.widget['text']
    var_entry.insert(0,'end')

button1 = tk.Button(win,text = '1')
button1.bind("<Button-1>", handle_button)
button1.grid()
# similarly I defined all the buttons.


windows()
win.mainloop()
0 голосов
/ 26 мая 2018

Чтобы получить поведение, которое вы ищете, все, что вам нужно сделать, это:

Измените это:

def handle_button(event):
    return var.insert(0,4)

На это:

def handle_button(event):
    var.set(4)

Тем не менеев вашем коде есть несколько вещей, которые здесь бесполезны.

  1. Глядя на return var.insert(0, 4).Этот return на самом деле здесь не делает ничего полезного, потому что он пытается вернуть результаты вызова var.insert(0, 4) и присвоить его тому, что когда-либо вызывало эту функцию.2 основные проблемы с этим.var.insert(0, 4) не собирается возвращать полезное значение для команды возврата, чтобы помочь, и во-вторых, вы не можете вернуть результат в привязку, которую он не использует.Вместо этого удалите возврат все вместе и просто напишите команду, использованную для обновления StringVar.В этом случае var.set(4).

  2. Глядя на var_entry = tk.Entry(win,text='var',textvariable=var).text = 'var' здесь на 100% бесполезен.В поле ввода аргумент text на самом деле является коротким для textvariable, поэтому здесь вы присваиваете строку var текстовой переменной, а затем немедленно переназначаете переменную text для StringVar ().Итак, давайте перепишем эту строку просто var_entry = tk.Entry(win, textvariable=var).

  3. Глядя на button1 = tk.Button(win,text = '1' ,textvariable = 1), вы делаете здесь что-то, что не поможет.textvariable = 1 здесь не имеет смысла.Так что давайте просто удалим это.Перепишите эту строку как button1 = tk.Button(win, text='1')

  4. Глядя на button1.bind("<Button-1>", handle_button) - это излишне для чего-то, что кнопка может обработать с аргументом command.Удалите эту строку полностью и перепишите button1, чтобы она содержала команду.Например: button1 = tk.Button(win, text='1', command=handle_button)

  5. Глядя на def window():, мы можем удалить эту функцию, взять ее содержимое и переместить его в глобальное пространство имен.Прямо сейчас нет смысла использовать функцию для настройки GUI, поэтому вместо этого давайте удалим дополнительный шаг.

При всем этом у вас должно быть что-то похожее на это:

import tkinter as tk


win = tk.Tk()
var = tk.StringVar()

var_entry = tk.Entry(win, textvariable=var)
var_entry.grid(row=1, column=2)

def handle_button():
    var.set(4)

tk.Button(win, text='1', command=handle_button).grid(row=2, column=0)

win.mainloop()

Я не уверен, что вы уже слышали о lambda, но его можно использовать здесь, чтобы немного уменьшить наш код.lambda используется для создания анонимной функции, и это означает, что мы можем создать однострочные функции, которые не требуют от нас определения функции по имени.

Так что, если мы удалим функцию def handle_button():, а затемизменив команду button1 на лямбду, мы можем сохранить себя еще на 2 строки кода, которые на самом деле не помогают нам и не улучшают читабельность.

Новый конечный код должен выглядеть следующим образом:

import tkinter as tk


win = tk.Tk()
var = tk.StringVar()

var_entry = tk.Entry(win, textvariable=var)
var_entry.grid(row=1, column=2)

tk.Button(win, text='1', command=lambda: var.set(4)).grid(row=2, column=0)

win.mainloop()

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

...