Отключить сразу несколько входных данных в двух виджетах ввода (tkinter)

#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:

Поскольку вы задали несколько вопросов. Я постараюсь дать ответы на вопросы.

  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)
     
  2. Я предполагаю, что проблема заключается в части функции и выражения press ..?
    [Piyush] Обсуждаемая выше проблема с виджетом ввода не возникает из-за функции press и выражения, определенного в нем. Основная причина этой проблемы указана в приведенном выше пункте.
  3. А также моя кнопка выхода не закроет мое окно …? [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. Да, но не одинаковое значение для обоих виджетов