Как обновить поле gui в ответ на нажатие пользователем кнопки - PullRequest
0 голосов
/ 15 января 2020

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

В идеале, у меня тоже есть опция гаммы или точной настройки, но я был озадачен первым препятствием.

Код до сих пор:

import tkinter

window = tkinter.Tk()
window.title("  Movey  ")


tkinter.Label(window, text="Current value").grid(row=0)


current_value_window = tkinter.Entry(window)

current_value_window.grid(row=0, column=1)

val_start = 1000

current_value_window.insert(0, val_start)


def lefty():
    print(val_start)
    val_start -= 10
    return val_start

def righty():
    pass

def accepty():
    pass


left_button = tkinter.Button(window, text = "Move Left", command = lefty, fg = "blue")
left_button.grid(row = 4, column = 0)

right_button = tkinter.Button(window, text = "Mover Right", command = righty, fg = "red")
right_button.grid(row = 4, column = 1)

accept_button = tkinter.Button(window, text = "OK", command = accepty, fg = "green")
accept_button.grid(row = 4, column = 2)


window.mainloop()

Ответы [ 2 ]

1 голос
/ 16 января 2020

Вы не можете получить доступ или обновить переменную уровня модуля внутри функции. Таким образом, вы должны глобализировать его внутри функции, прежде чем получить к ней доступ. И вам не нужно return обновленное значение, просто используйте delete, чтобы очистить содержимое виджета Entry, а затем используйте insert, чтобы поместить обновленное значение в виджет Entry.

Вот так:

import tkinter as tk

window = tk.Tk()
window.title("  Movey  ")

tk.Label(window, text="Current value").grid(row=0)

current_value_window = tk.Entry(window)
current_value_window.grid(row=0, column=1)

val_start = 1000

current_value_window.insert(0, val_start)


def lefty():
    global val_start
    val_start -= 10
    current_value_window.delete(0, tk.END)
    current_value_window.insert(0, val_start)
    print(val_start)


def righty():
    global val_start
    val_start += 10
    current_value_window.delete(0, tk.END)
    current_value_window.insert(0, val_start)
    print(val_start)


def accepty():
    pass


left_button = tk.Button(window, text="Move Left", command=lefty, fg="blue")
left_button.grid(row=4, column=0)

right_button = tk.Button(window, text="Mover Right", command=righty, fg="red")
right_button.grid(row=4, column=1)

accept_button = tk.Button(window, text="OK", command=accepty, fg="green")
accept_button.grid(row=4, column=2)

window.mainloop()
0 голосов
/ 16 января 2020

В чем конкретно ваша проблема? Что вы ищете? Прямо сейчас вы только описали, что вы пытаетесь сделать, но не там, где ваша настоящая проблема.

Некоторые первые намеки. Вместо Entry попробуйте использовать Label для отображения номера, в противном случае пользователь может просто ввести число в ... и тогда кнопки не будут иметь никакого смысла ...

Следующее, что меня интересует, это ваше расположение в рядах. В случае, если вы пытаетесь оставить пространство между метками и кнопками, простое размещение одного в row=0, а другого в row=4 не поможет, строки 1-3 имеют высоту 0ptx. Вы можете задать им некоторую высоту без содержимого с помощью

    window.grid_rowconfigure("row_number",minsize="size_in_ptx")

Тогда эти строки будут иметь минимальную высоту, без чего-либо внутри, так что вы можете использовать их для разнесения. Наконец, когда вы пытаетесь обновить значение вашего Entry или label или того, что вы используете для отображения числа, недостаточно изменить значение переменной val_start. Изучите метод конфигурации из Tkinter: Описание конфигурации Вам необходимо переназначить значение на Label или Entry

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