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

Мне нужно запрограммировать графический интерфейс (сенсорный экран) с помощью tkinter для Raspberry Pi. У меня есть два виджета ввода, которые мне нужно вводить отдельно. К сожалению обе записи пишутся, когда я ввожу значение на цифровой клавиатуре. Как это изменить, чтобы я мог вводить значение только в виджете ввода, который выбран? Я предполагаю, что проблема в части функции нажатия и выражения..? А также моя кнопка «Выход» не закрывает окно...?

Спасибо за помощь!

Это мой код:

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()
    

person Murat999    schedule 12.12.2020    source источник
comment
Чтобы выйти, попробуйте gui.destroy. Кроме этого, я не понимаю другой части вашего вопроса. Все ваши Entry имеют одно и то же textvariable, это сделано специально?   -  person Cool Cloud    schedule 13.12.2020


Ответы (3)


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

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

  3. А также моя кнопка «Выход» не закрывает окно...? [Пиюш] Я проверил общий код, запустив его на своем конце, и кнопка выхода работает, как и ожидалось, она закрывает окно. Это не работает на вашем конце, это может быть из-за среды python (версия python и т. д.). Есть еще один способ, с помощью которого вы можете закрыть окно, вместо использования GUI.quit вы можете использовать GUI.destroy и посмотреть, поможет ли это.

person Piyush Chanchal    schedule 12.12.2020
comment
Спасибо за помощь, GUI.destroy помог! Но проблема с виджетом все еще возникает. Я могу ввести выбранное значение отдельно, когда я ввожу значение с клавиатуры своего компьютера, но оно не работает, когда я пытаюсь ввести значения, нажимая цифровые кнопки, которые у меня есть в моем графическом интерфейсе... вот почему я подумал, что это в корреляция с функцией пресса... - person Murat999; 13.12.2020
comment
Поскольку мы изменили текстовые переменные для виджетов ввода с уравнения на уравнение1 и уравнение2, поэтому функция нажатия также должна быть обновлена ​​соответствующим образом, потому что в функции нажатия мы все еще используем переменную уравнения. Просто обновите эту переменную также в функции пресса. Я просто изменил его с переменной уравнения на уравнение 1, и оно работает. Если вы хотите, чтобы эта цифровая кнопка добавляла значение во второй виджет ввода, тогда уравнение должно быть изменено на уравнение2. Просто попробуйте это и дайте мне знать, если это работает. - person Piyush Chanchal; 14.12.2020
comment
Когда я это делаю, я получаю сообщение об ошибке: NameError: имя «уравнение» не определено, для уравнения в прессе - person Murat999; 14.12.2020

Вот мой новый код, который не работает:

'''

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)

'''

person Murat999    schedule 13.12.2020

Вот код изменения, который вы можете попробовать -

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)
person Piyush Chanchal    schedule 14.12.2020
comment
С этим я могу только ввести значение в виджет 1, но не в виджет 2. - person Murat999; 14.12.2020
comment
Вы хотите ввести значение в обоих виджетах ввода? - person Piyush Chanchal; 14.12.2020
comment
Да, но не одинаковое значение для обоих виджетов - person Murat999; 14.12.2020