#python #tkinter #button #widget #numpad
#python #tkinter #кнопка #виджет #numpad
Вопрос:
Мне нужно запрограммировать графический интерфейс (сенсорный экран) с помощью tkinter для Raspberry Pi. У меня есть два виджета ввода, которые мне нужно вводить отдельно. К сожалению, обе записи записываются, когда я ввожу значение на цифровой клавиатуре. Как это изменить, чтобы я мог вводить только значение в виджете ввода, которое выбрано? Я предполагаю, что проблема заключается в части функции и выражения press ..? А также моя кнопка выхода не закроет мое окно …?
Спасибо за вашу помощь!
Это мой код:
import sys
import time
import struct
import select
import signal
import subprocess
import os
import shared
from tkinter import *
import tkinter
import time
ug = 0 #lower bound [cm]
og = 41 #Nutzbare höhe Wassertank [cm]
run = 0
run1 = 1
xdis = 1
ydis = 1
# globally declare the expression variable
expression = ""
# Function to update expression in the text entry box
def press(num):
global expression
expression = expression str(num)
equation.set(expression)
def clear():
global expression
expression = ""
equation.set("")
#create GUI
if __name__ == "__main__":
# create a GUI window
gui = Tk()
gui.title("GUI")
equation = StringVar()
#Label 1
label1 = tkinter.Label(text ="Pumpenhöhe 1")
label1.grid (row =0 , column =0 , padx = xdis , pady = ydis )
#Eingabefeld 1 definieren
eingabe1 = tkinter.Entry(gui, textvariable=equation, width=4, bg ='#ffffff')
eingabe1.grid(row=0, column=1, padx=xdis, pady = ydis)
eingabe1.focus_set()
#Label 2
label2 = tkinter.Label (text ="Pumpenhöhe 2")
label2.grid(row=1,column =0 , padx = xdis ,pady = ydis)
#Eingabefeld 2
eingabe2 = tkinter.Entry(gui, textvariable=equation, width=4, bg ='#ffffff')
eingabe2.grid(row=1, column=1, padx=xdis, pady = ydis)
#button obj to start thread
start_thread = tkinter.Button(text ="start thread(main loop)", command=start_thread)
start_thread.grid(row=2, column=1, padx=xdis, pady = ydis)
#button obj on framework to start thread
set_setpoints = tkinter.Button(text ="Send", command = set_setpoints)
set_setpoints.grid(row=2, column=2, padx= xdis, pady = ydis)
#create exit button
ex_bt = tkinter.Button(gui, text='Exit', command=gui.quit)
ex_bt.grid(row=7, column=2, sticky=tkinter.W, padx=xdis, pady=ydis)
#buttons for numpad
.
.
.
clear = Button(gui, text='Clear',
command=clear, height=1, width=7)
clear.grid(row=6, column='1')
Decimal= Button(gui, text='.',
command=lambda: press('.'), height=1, width=7)
Decimal.grid(row=6, column=2)
gui.mainloop()
Вот мой новый код, который не работает:
»’
def press(num):
global expression
expression = expression str(num)
equation.set(expression)
def clear():
global expression
expression = ""
equation1.set("")
equation2.set("")
#create GUI
# Driver code
if __name__ == "__main__":
# create a GUI window
gui = Tk()
gui.title("GUI")
equation1 = StringVar()
equation2 = StringVar()
equation1.set("")
equation2.set("")
#Label 1
label1 = tkinter.Label(text ="Pumpenhöhe 1")
label1.grid (row =0 , column =0 , padx = xdis , pady = ydis )
#Eingabefeld 1 definieren
eingabe1 = tkinter.Entry(gui, textvariable=equation1, width=4, bg ='#ffffff')
eingabe1.grid(row=0, column=1, padx=xdis, pady = ydis)
eingabe1.focus_set()
#Label 2
label2 = tkinter.Label (text ="Pumpenhöhe 2")
label2.grid(row=1,column =0 , padx = xdis ,pady = ydis)
#Eingabefeld 2
eingabe2 = tkinter.Entry(gui, textvariable=equation2, width=4, bg ='#ffffff')
eingabe2.grid(row=1, column=1, padx=xdis, pady = ydis)
»’
Комментарии:
1. Для выхода попробуйте
gui.destroy
. Кроме этого, я не понимаю другую часть вашего вопроса. У всех васEntry
то жеtextvariable
самое, это сделано специально?
Ответ №1:
Поскольку вы задали несколько вопросов. Я постараюсь дать ответы на вопросы.
- У меня есть два виджета ввода, которые мне нужно вводить отдельно. К сожалению, обе записи записываются, когда я ввожу значение на цифровой клавиатуре. Как это изменить, чтобы я мог вводить только значение в виджете ввода, которое выбрано? [Piyush] Одна и та же текстовая переменная (уравнение) использовалась для обоих виджетов ввода, поскольку оба виджета ввода являются отдельными, поэтому для обоих виджетов ввода следует использовать разные текстовые переменные. Я отредактировал фрагмент кода для обоих виджетов ввода, который упоминается ниже —
equation1 = StringVar() equation2 = StringVar() equation1.set("") equation2.set("") #Label 1 label1 = tkinter.Label(text ="Pumpenhöhe 1") label1.grid (row =0 , column =0 , padx = xdis , pady = ydis ) #Eingabefeld 1 definieren eingabe1 = tkinter.Entry(gui, textvariable=equation1, width=4, bg ='#ffffff') eingabe1.grid(row=0, column=1, padx=xdis, pady = ydis) eingabe1.focus_set() #Label 2 label2 = tkinter.Label (text ="Pumpenhöhe 2") label2.grid(row=1,column =0 , padx = xdis ,pady = ydis) #Eingabefeld 2 eingabe2 = tkinter.Entry(gui, textvariable=equation2, width=4, bg ='#ffffff') eingabe2.grid(row=1, column=1, padx=xdis, pady = ydis)
- Я предполагаю, что проблема заключается в части функции и выражения press ..?
[Piyush] Обсуждаемая выше проблема с виджетом ввода не возникает из-за функции press и выражения, определенного в нем. Основная причина этой проблемы указана в приведенном выше пункте. - А также моя кнопка выхода не закроет мое окно …? [Piyush] Я проверил общий код, запустив его на своем конце, и кнопка выхода работает, как и ожидалось, она закрывает окно. Это не работает с вашей стороны, это может быть из-за среды python (версия python и т. Д.). Существует другой способ, с помощью которого вы можете закрыть окно вместо использования GUI.выход вы можете использовать GUI.destroy и посмотреть, поможет ли это.
Комментарии:
1. Спасибо за вашу помощь, GUI.destroy помог! Но проблема с виджетами все еще возникает. Я могу ввести выбранное значение отдельно, когда я ввожу значение с клавиатуры своего компьютера, но это не работает, когда я пытаюсь ввести значения, нажимая цифровые кнопки, которые у меня есть в моем графическом интерфейсе … вот почему я подумал, что это связано с функцией нажатия…
2. Поскольку мы изменили текстовые переменные для виджетов ввода с «equation» на «equation1» и «equation2», функция press также должна быть соответствующим образом обновлена, потому что в функции press мы по-прежнему используем переменную «equation». Просто обновите эту переменную и в функции press. Я просто изменил его с переменной «equation» на «equation1», и он работает. Если вы хотите, чтобы эта кнопка с номером добавляла значение во втором виджете ввода, тогда «уравнение» следует изменить на «equation2». Просто попробуйте это и дайте мне знать, если это сработает.
3. Когда я делаю это, я получаю сообщение об ошибке:»Ошибка имени: имя «уравнение» не определено», для уравнения в press
Ответ №2:
Вот код пересмотра, который вы можете попробовать —
def press(num):
global expression
expression = expression str(num)
equation1.set(expression)
def clear():
global expression
expression = ""
equation1.set("")
equation2.set("")
#create GUI
# Driver code
if __name__ == "__main__":
# create a GUI window
gui = Tk()
gui.title("GUI")
equation1 = StringVar()
equation2 = StringVar()
equation1.set("")
equation2.set("")
#Label 1
label1 = tkinter.Label(text ="Pumpenhöhe 1")
label1.grid (row =0 , column =0 , padx = xdis , pady = ydis )
#Eingabefeld 1 definieren
eingabe1 = tkinter.Entry(gui, textvariable=equation1, width=4, bg ='#ffffff')
eingabe1.grid(row=0, column=1, padx=xdis, pady = ydis)
eingabe1.focus_set()
#Label 2
label2 = tkinter.Label (text ="Pumpenhöhe 2")
label2.grid(row=1,column =0 , padx = xdis ,pady = ydis)
#Eingabefeld 2
eingabe2 = tkinter.Entry(gui, textvariable=equation2, width=4, bg ='#ffffff')
eingabe2.grid(row=1, column=1, padx=xdis, pady = ydis)
Комментарии:
1. При этом я могу вводить значение только в виджете 1, но не в виджете 2
2. Вы хотите ввести значение в оба виджета ввода?
3. Да, но не одинаковое значение для обоих виджетов