2016-08-06 33 views
-1

haben eine Weile nach einer Antwort gesucht. Ich bin neu bei Python, aber nicht bei der Programmierung im Allgemeinen. Die verschiedenen Versionen sind ziemlich herausfordernd!Wie man Fokus in tkinter Eingabefeld setzt

Auf jeden Fall bin ich sehr Gui orientierte und haben zu erhalten tkinter verwaltet mit Python arbeiten 3.5.1

nur mit Grundlagen zu spielen und habe den folgenden Code, sondern den Fokus auf das erste Eingabefeld nicht festlegen. Habe mEntry1.focus() und mEntry1.focus_set() versucht, aber das Objekt hat immer keinen Attributfehler. Irgendeine Hilfe?

from tkinter import * 

def calc(*args): 
    try: 
     value1 = float(V1.get()) 
     value2 = float(V2.get()) 
     result.set(value1 * value2) 
    except ValueError: 
    pass 
mGui = Tk() 
mGui.geometry('450x450+200+200') 
mGui.title('Test Gui') 
V1 = StringVar() 
V2 = StringVar() 
result = StringVar() 
mEntry1 = Entry(textvariable=V1,width=10).grid(row=0,column=0,sticky=W) 
mEntry2 = Entry(textvariable=V2).grid(row=1,column=0) 
mButton = Button(text='Calculate',command=calc).grid(row=3,column=0) 
mlabel = Label(textvariable=result).grid(row=4,column=2) 
+0

Und was passiert, wenn Sie 'mEntry'.focus_set()'? Das Ergebnis, das Sie erhalten, wird Ihnen das Problem mitteilen. –

+0

Eines der starken Merkmale von Python sind die Trackbacks und Fehlermeldungen. Lerne sie zu verstehen und zu benutzen. Ich vermute, Sie haben "AttributeError: 'NoneType' Objekt hat kein Attribut 'Fokus_set'". Das bedeutet, dass mEntry das Singleton None ist, nicht ein Entry, wie du es dir gedacht hast. Sie müssen außerdem wissen, dass die Standardrückgabe für Anrufe None ist. Wenn also die Hilfe für .grid sagt "Setze ein Widget ..." und sagt nie, was es zurückgibt, nimm keine an. Dies ist normal für reine Nebeneffektrufe. –

Antwort

1

Jedes Tkinter-Widget hat die focus_set Methode. Das Problem mit Ihrem Code ist, dass die Methode .gridNone zurückgibt. So

mEntry1 = Entry(textvariable=V1,width=10).grid(row=0,column=0,sticky=W) 

Sets mEntry1-None, nicht das Widget. So müssen Sie das Widget erstellen und sie in das Netz in zwei Schritten setzen:

mEntry1 = Entry(textvariable=V1,width=10) 
mEntry1.grid(row=0,column=0,sticky=W) 

Natürlich, wenn Sie nicht wirklich Notwendigkeit einen Verweis auf das Widget-Objekt dann ist es in Ordnung, es zu tun in einem Schritt. So etwas wie

Entry(textvariable=V1,width=10).grid(row=0,column=0,sticky=W) 

wäre in Ordnung.


BTW, es ist keine gute Idee, from tkinter import * zu verwenden. Es importiert mehr als 130 Namen in Ihren Namespace, was zu Namenskollisionen mit Ihren eigenen Namen oder mit denen anderer Module führen kann, wenn Sie diese auch mit einer "star" import-Anweisung importieren. Es macht auch den Code schwieriger zu lesen. Stattdessen können Sie

import tkinter as tk 

tun und dann zu Tkinter Namen beziehen sich die tk. Präfix, zB tk.Entry statt Entry.

+0

Vielen Dank in der Tat, großartige Erklärung. Ich habe die letzten 3 Jahre damit verbracht, Filemaker zu programmieren und finde das im Vergleich ein bisschen bergauf! –

+0

@AndyEvans Ich bin froh, dass Sie meine Antwort mögen, bitte beachten [akzeptieren] (http://meta.stackexchange.com/a/5235) es. :) Ich bin nicht vertraut mit Filemaker, aber ich denke, Tkinter arbeitet auf einem niedrigeren Niveau als das, was Sie gewohnt sind. Und dass das Paradigma der [ereignisgesteuerten Programmierung] (https://en.wikipedia.org/wiki/Event-driven_programming) eine andere Arbeitsweise ist als das, was Sie in Filemaker tun. –

+0

(Forts.) Ja, es kann ein bisschen schwierig sein, es zuerst zu verstehen, aber wenn Sie weiterhin mit kleinen eigenen Testprogrammen spielen und die zahlreichen guten Beispiele hier auf SO (und anderswo online) modifizieren, ich bin mir sicher, dass du dich allmählich damit wohl fühlst. –