Назначить значение из записи Tkinter в переменную Python - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я изучаю Python и преодолел контрольно-пропускной пункт. Я начал в java и наслаждался использованием JOptionPane для диалогов ввода и использованием этих диалогов, чтобы назначать значения переменным и анализировать их оттуда.

В python я заметил, что люди используют Tkinter для большинства основных настроек графического интерфейса, но я не смог найти много информации о том, как использовать текстовое поле, созданное с помощью tkinter, для присвоения значения переменной. Мой код выглядит следующим образом:

import random
import tkinter as tk

def guess():
    global entry
    guess = entry.get()
    guessN = int(guess)


root1 = tk.Tk()

label = tk.Label(root1, text='What number am I thinking of between 1 and 100?')
entry = tk.Entry(root1)
entry.focus_set()

b = tk.Button(root1,text='okay',command=guess)
b.pack(side='bottom')

label.pack(side = tk.TOP)
entry.pack()

root1.mainloop():

x = random.randint(1,101)

guess()
tries = 0

while guessN != x:
    if (guessN < x):
        guess = input("Too low! Try again.")
        guessN = int(guess)
        tries += 1
    else:
        guess = input("Too high! Try again.")
        guessN = int(guess)        
        tries += 1

print('Congratulations you guessed the number', x, 'in', tries, 'tries!')
SystemExit

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

1 Ответ

0 голосов
/ 31 августа 2018

вручную

Согласно Виджет входа в Tkinter :

Во-первых, вы можете просто прочитать значение из Entry с помощью

entry.get()

Во-вторых, вы можете связать его с tkinter.Variable (он создает и переносит глобальную переменную Tcl с автоматически сгенерированным именем). Обычно используется его подкласс StringVar - он конвертирует значения в str при получении / установке.

v = tkinter.StringVar()
entry = tk.Entry(root1, textvariable=v)

<...>
value = v.get()

Не большая разница, как вы можете видеть, только добавляет уровень косвенности. Оба метода получат str, поэтому вам нужно проанализировать его с int(). Но вы можете использовать IntVar вместо Variable (или StringVar), который будет анализировать его для вас на .get() (и повысит ValueError, если это недопустимое целое число).

Автоматически

Чтобы автоматически g обновлять переменную Python при изменении значения Entry, используйте Variable.trace_add:

def callback(tcl_name,index,op):
    global myvar
    # See https://tcl.tk/man/tcl8.6/TclCmd/trace.htm#M14 about the arguments.
    # A callback is only passed the name of the underlying Tcl variable
    # so have to construct a new Variable of the same class on the fly 
    # that wraps it to get the value and convert it to the appropriate type.
    # Yes, it's this hacky.
    try: myvar = StringVar(tcl_name).get()
    except ValueError: myvar = None

v.trace_add("write",callback)

Менее хакерским решением для callback было бы сделать обратный вызов методом экземпляра Variable - таким образом, он получит ссылку на него через self вместо того, чтобы создавать новый класс. пример. Значение можно также сделать атрибутом экземпляра:

def callback(self,*args):
    try: self.value=self.get()
    except ValueError: self.value=None

v.callback=callback
v.trace_add("write",v.callback)

Обратите внимание, что это будет вызываться при каждом изменении - т. Е. Даже при вводе значения - и, следовательно, может вызвать заметные задержки в реакции графического интерфейса пользователя. Поэтому, если вам действительно не нужно постоянно следить за значением, достаточно просто прочитать его один раз в подходящий момент.

...