3

Ich habe in den letzten Wochen an einem Projekt gearbeitet, wo ich mit einem Industrieroboter über eine drahtlose Verbindung und REST-Protokoll über ein Raspberry Pi und Python interagieren . Ich bin neu bei Python aber vertraut mit C++, daher bin ich nicht neu in der Programmierung notwendig.Python Eingabezeile wird nicht Tastatureingabe - Typen im Terminal statt

Ich habe eine GUI mit Tkinter in Python erstellt (dank vieler Ihrer Hilfe bereits) und ich versuche, eine Art von Kiosk-Modus zu erstellen. Ich habe bereits die GUI gestartet Vollbild ohne eine Option, um es zu schließen. Woran ich festhalte, ist, dass ich versuche, in einem der Popup-Fenster in meiner GUI eine Eingabezeile zu erstellen, die bei Eingabe der korrekten Passwort-Zeichenkette die GUI für Administratoren oder autorisierte Personen schließt, um auf den Rest zugreifen zu können der Raspberry Pi-Dateien, falls erforderlich. Ich glaube, dass ich weiß, wie dieser Prozess mit der root.quit() -Methode funktioniert (das übergeordnete Fenster ist root), aber die Eingabezeile zeigt überhaupt keinen Text. Der gesamte Text, den ich eintippe, wird im Terminal eingegeben, obwohl meine GUI Vollbild ist. Hier ist der spezifische Code-Abschnitt mit Kommentaren für die Popup-Fenster, das ich versuche, die Eingabezeile zu erhalten, um in:

################## Status Window ################## 
def statusWindow():              #defines function for popup window for additional options 
    window = Toplevel(root)            #creates variable to place widgets in window 
    window.title('Status')            #makes window title for specific window frame 
    w, h = window.winfo_screenwidth(), window.winfo_screenheight()  #aquires dimensions from display size 
    window.geometry("%dx%d+0+0" % (w, h))        #sets window size to aquired dimensions 
    window.overrideredirect(True)          #removes top bar and exit button from parent window frame 

    batteryButton = Button(window, text="Battery", fg="green", command=lambda: showBattery(window), width=35, height=12)  #defines criteria for battery button in new window 
    statusButton = Button(window, text="Overview", fg="green", command=lambda: showQueueStatus(window), width=35, height=12) #defines criteria for status button in new window 
    returnButton = Button(window, text="Return...", fg="green", command=window.destroy, width=35, height=12)     ##defines criteria for return button in new window 
    passEntry = Entry(window, show="*") 

    batteryButton.grid(row=1, column=0, padx=10, pady=5)  #makes button viewable in specified orientation                 
    statusButton.grid(row=2, column=0, padx=10, pady=5)   #makes button viewable in specified orientation 
    returnButton.grid(row=3, column=0, padx=10, pady=5)   #makes button viewable in specified orientation 
    passEntry.grid(row=4, columnspan=10, sticky=W) 

    robotName(window)  #call robotName function to display robot name 
    winReturn(window)  #call winReturn function to create return label 

def robotName(winFrame):        #define function to display robot name in status window 
    label = Label(winFrame, text="Robot Name: ")  #defines variable label for visual display 
    name = robot.robot_name()       #gets robot name from robot and stores it in name variable 
    nameLabel = Label(winFrame, text=name)    #defines variable label for visual to hold robot name as string   

    label.grid(row=0, column=0, padx=10, pady=5)  #makes label display in popup window 
    nameLabel.grid(row=0, column=3, padx=10, pady=5) #makes robot name display in popup window 

def showBattery(winFrame):         #define function to display current battery percentage in popup window 
    battery = robot.battery_percentage()     #retrieves current battery status from robot and stores it in battery variable 
    battery = str(battery) + '%'       #redefines battery variable as previous battery variable string with percentage 
    batteryLabel = Label(winFrame, text=battery)   #defines battery label with specified criteria 
    batteryLabel.grid(row=1, column=3, padx=10, pady=5)  #displays battery label in popup window 

def showQueueStatus(winFrame):        #define function to display current robot mission queue item status 
    queue = robot.robot_state_text()      #retrieves current queue item status and stores in queue variable 
    qStatusLabel = Label(winFrame, text=queue)    #defines queue status label with specified criteria 
    qStatusLabel.grid(row=2, column=3, padx=10, pady=5)  #displays queue status label in popup window 

def winReturn(winFrame):          #define function to display label for return button 
    returnLabel = Label(winFrame, text="Close out of window") #defines return label with specified criteria 
    returnLabel.grid(row=3, column=3, padx=10, pady=5)   #displays return label in popup window 

ich die Eingabezeile in der Statuswindow() Definition gesetzt habe, da dies die Methode das wird vom Rest meines Programms aufgerufen. Wenn Sie irgendwelche Ideen haben, warum es mich nicht die Eingabezeile eingibt, würde Ihr Rat geschätzt werden. Wenn mehr Beispiele meines Codes benötigt werden, kann ich mehr posten, aber ich habe versucht, diesen Beitrag kurz zu halten.

+0

Hallo J.Kors. Es gibt eine Menge Code hier und es wäre am besten, wenn Sie ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) bereitstellen könnten. Möglicherweise gibt es etwas in Ihrem Code, das dieses Problem verursacht, und wenn Sie ein MCVE erstellen, können Sie das Problem selbst finden. Und wenn das Problem weiterhin besteht, würde es uns etwas bieten, mit dem wir testen können. –

+0

Ich stimme zu, dass es etwas in meinem Code gibt, das es verbietet, Benutzertext in eine Eingabezeile einzugeben. Ich habe ein zweites, kleineres Programm erstellt, das nur für eine Eingabezeile funktioniert. Meine Vermutung ist, dass es etwas mit den Tkinter-Frames zu tun hat, die ich verwende. Könnte es der Schwerpunkt der Widgets sein? –

+0

Ich sehe in dem Code, den Sie uns bisher gezeigt haben, nichts, was dazu führen kann, dass der Benutzer in die Konsole statt in das Eingabefeld eintippt. Verfügt der Benutzer über eine Maus, mit der er interagieren kann, oder handelt es sich um eine Touchscreen-Basis? –

Antwort

2

Ohne Wenn Sie sehen, wie Ihr Programm funktioniert, brauchen Sie nicht wirklich ein Toplevel-Fenster zu erstellen, um Administratorzugriff zu erhalten. Sie können tkinters simpledialog Funktion verwenden, um nach einem Passwort zu fragen und dann iconify() verwenden, um das Fenster zu minimieren.

Schauen Sie sich dieses Beispiel an.

from tkinter import * 
from tkinter import simpledialog 
# from Tkinter import * # for python 2.x 
# import tkSimpleDialog as simpledialog # for python 2.x 

root = Tk() 
root.attributes("-fullscreen", True)# fullscreen without the standard window buttons 

def check_admin_password(): 
    # use askstring here to verify password. 
    pass_attempt = simpledialog.askstring("Verifying access", 
              "Please enter Admin password") 
    if pass_attempt == "password": 
     root.iconify() # used whatever your instance of Tk() is here in place of root. 

admin_minimize_button = Button(root, text = "Minimize window", command = check_admin_password) 
admin_minimize_button.pack() 

root.mainloop() 
+0

Ich habe diesen Code versucht, um zu sehen, ob ich irgendetwas davon verwenden könnte, aber als ich versuchte, es alleine auszuführen, wurde mir ein Fehler gegeben dass es SimpleDialog nicht importieren konnte. Ich habe die Import-Zeile kommentiert und sie mit nur einer Minimieren-Schaltfläche geöffnet, aber ohne Befehle oder Methoden, die sie aufgerufen hat. Ich nehme an, dass passiert ist, da es den Simplydialog nicht importieren konnte. –

+0

@ J.kors Welche Version von Python verwenden Sie? –

+0

Ich verwende Python 2.7 auf meinem Raspberry Pi 3. Als Antwort auf Ihren anderen Kommentar oben, ich habe gerade versucht, die force_focus() verwendet und es dauert immer noch die Tastatureingabe im Terminal seltsam genug. –

0

können Sie tun, um eine

passEntry.bind('<Return>', myfunc) 

eine Kennwortüberprüfung Funktion aufzurufen, Ihre Entscheidung zu treffen, was usw. zu tun, wenn Sie die Vollbild-gui zu verstecken brauchen, versuchen

root.tk.call('wm', 'withdraw', root) 
Verwandte Themen