Gå til innhold

[Python] Nybegynnerspørsmål om fokus i GUI


Anbefalte innlegg

Heisann.

 

Jeg bruker TKinter og har fulgt Denne guiden for å opprette en boks man kan skrive i, og få fokus i denne boksen.

 

Nå vil jeg lage to bokser man kan skrive i, og få fokus i den første av de to boksene. Problemet er at fokuset havner i den siste, og jeg ønsker at den skal starte i den første boksen. Hvordan gjør jeg dette?

 

 

Jeg lager to tekst-bokser her:

   self.entryVariable1 = Tkinter.StringVar()
   self.entry = Tkinter.Entry(self, textvariable=self.entryVariable1)
   self.entry.grid(column=0, row=0, sticky='EW')
   self.entry.bind("<Return>", self.OnPressEnter)
   self.entryVariable1.set(u"Enter text here.")

   self.entryVariable2 = Tkinter.StringVar()
   self.entry = Tkinter.Entry(self, textvariable=self.entryVariable2)
   self.entry.grid(column=1, row=0, sticky='EW')
   self.entry.bind("<Return>", self.OnPressEnter)
   self.entryVariable2.set(u"Enter text here.")

 

 

og så linja for fokus litt lenger ned:

 

   self.entry.focus_set()
   self.entry.selection_range(0, Tkinter.END)

 

 

 

 

Legger hele koden i spoiler nedenfor hvis det er noe informasjon jeg ikke har gitt

 

 

#!/usr/bin/python
# -*- coding: utf-8 -*-

import Tkinter

class simpleapp_tk(Tkinter.Tk):
 def __init__(self,parent):
   Tkinter.Tk.__init__(self,parent)
   self.parent = parent
   self.initialize()

 def initialize(self):
   self.grid()



   self.entryVariable1 = Tkinter.StringVar()
   self.entry = Tkinter.Entry(self, textvariable=self.entryVariable1)
   self.entry.grid(column=0, row=0, sticky='EW')
   self.entry.bind("<Return>", self.OnPressEnter)
   self.entryVariable1.set(u"Enter text here.")

   self.entryVariable2 = Tkinter.StringVar()
   self.entry = Tkinter.Entry(self, textvariable=self.entryVariable2)
   self.entry.grid(column=1, row=0, sticky='EW')
   self.entry.bind("<Return>", self.OnPressEnter)
   self.entryVariable2.set(u"Enter text here.")


   button = Tkinter.Button(self, text=u"Click me !",
     command=self.OnButtonClick)
   button.grid(column=2, row=0)

   self.labelVariable = Tkinter.StringVar()
   label = Tkinter.Label(self, textvariable=self.labelVariable,
     anchor="w", fg="white", bg="blue")
   label.grid(column=0, row=2, columnspan=2, sticky='EW')
   self.labelVariable.set(u"Hello !")




   self.grid_columnconfigure(0, weight=1)
   self.resizable(True, False)
   self.update()
   self.geometry(self.geometry())
   self.entry.focus_set()
   self.entry.selection_range(0, Tkinter.END)

 def OnButtonClick(self):
   self.labelVariable.set(self.entryVariable1.get()+self.entryVariable2.get()+" (You clicked the button !")
   self.entry.focus_set()
   self.entry.selection_range(0, Tkinter.END)

 def OnPressEnter(self, event):
   self.labelVariable.set(self.entryVariable1.get()+self.entryVariable2.get()+" (You pressed enter !")
   self.entry.focus_set()
   self.entry.selection_range(0, Tkinter.END)

if __name__ == "__main__":
 app = simpleapp_tk(None)
 app.title('my application')
 app.mainloop()

 

 

Lenke til kommentar
Videoannonse
Annonse

Da skulle det væe greit,problemet var at self.entry var lik på begge tekstbokser.

Og da lese den andre tekstboksen sist.

 

import Tkinter

class simpleapp_tk(Tkinter.Tk):
 def __init__(self,parent):
   Tkinter.Tk.__init__(self,parent)
   self.parent = parent
   self.initialize()

 def initialize(self):
   self.grid()
   self.entryVariable1 = Tkinter.StringVar()
   self.entry1 = Tkinter.Entry(self, textvariable=self.entryVariable1)
   self.entry1.grid(column=0, row=0, sticky='EW')
   self.entry1.bind("<Return>", self.OnPressEnter)
   #self.entryVariable1.set(u"Enter text here.")

   self.entryVariable2 = Tkinter.StringVar()
   self.entry = Tkinter.Entry(self, textvariable=self.entryVariable2)
   self.entry.grid(column=1, row=0, sticky='EW')
   self.entry.bind("<Return>", self.OnPressEnter)
   #self.entryVariable2.set(u"Enter text here.")

   button = Tkinter.Button(self, text=u"Click me !",
     command=self.OnButtonclick)
   button.grid(column=2, row=0)

   self.labelVariable = Tkinter.StringVar()
   label = Tkinter.Label(self, textvariable=self.labelVariable,
     anchor="w", fg="white", bg="blue")
   label.grid(column=0, row=2, columnspan=2, sticky='EW')
   self.labelVariable.set(u"Hello !")

   self.grid_columnconfigure(0, weight=1)
   self.resizable(True, False)
   self.update()
   self.geometry(self.geometry())
   self.entry1.focus_set()
   self.entry.selection_range(0, Tkinter.END)

 def OnButtonclick(self):
   self.labelVariable.set(self.entryVariable1.get()+self.entryVariable2.get())
   self.entry.focus_set()
   self.entry.selection_range(0, Tkinter.END)

 def OnPressEnter(self, event):
   self.labelVariable.set(self.entryVariable1.get()+self.entryVariable2.get())
   self.entry.focus_set()
   self.entry.selection_range(0, Tkinter.END)

if __name__ == "__main__":
 app = simpleapp_tk(None)
 app.title('my application')
 app.mainloop()

 

Nå bruker jeg ikke tkinter finner wxpython mye bedere.

Tkinter ser ikke bra ut i windows,og for meg er dette ikke godt nok.

Last ned wxdemo,kan være smart her ser du det meste av hva wxpython har og by på.

Heter win32-docs-demos.

Jeg har pakket ut til c:\demo

Starter den sånn fra en py fil.

import os
os.system('python C:\demo\demo\demo.py')

Da ser det sånn ut når det virker.

post-53555-1281077402,0661_thumb.png

Lenke til kommentar

Takk skal du ha. Funka fjell nå :)

Tror jeg skal se nermere på wxpython etter hvert ja.

 

 

Så blir neste spørsmålet: Hvordan får jeg innholdet i en av disse boksene til å bli variabler tilsvarende de jeg har laget i andre program uten GUI?

Ta for eksempel programmet jeg la ut tidligere med fractions. Markerer med stjerne på de linjene jeg har gjort endringer, i forsøk på å få det til.

 

(Det jeg ønsker med koden er at jeg skal kunne skrive 3/6, også skal den printe ut 1/2. Tilsvarende denne koden uten gui:

import fractions
import Tkinter

a = raw_input('r1, k1: ')
a1 = fractions.Fraction(a)
print a1

 

 

 

#!/usr/bin/python
# -*- coding: utf-8 -*-

import fractions ****
import Tkinter

class simpleapp_tk(Tkinter.Tk):
 def __init__(self,parent):
   Tkinter.Tk.__init__(self,parent)
   self.parent = parent
   self.initialize()

 def initialize(self):
   self.grid()

   self.entryVariable1 = Tkinter.StringVar()
   self.entry1 = Tkinter.Entry(self, textvariable=self.entryVariable1)
   self.entry1.grid(column=0, row=0, sticky='EW')
   self.entry1.bind("<Return>", self.OnPressEnter)
   self.entryVariable1.set(u"Enter text here.")

   self.entryVariable2 = Tkinter.StringVar()
   self.entry = Tkinter.Entry(self, textvariable=self.entryVariable2)
   self.entry.grid(column=1, row=0, sticky='EW')
   self.entry.bind("<Return>", self.OnPressEnter)
   self.entryVariable2.set(u"Enter text here.")


   a1 = fractions.Fraction(entryVariable1)   ****
   b1 = fractions.Fraction(entryVariable2)   ****



   button = Tkinter.Button(self, text=u"Click me !",
     command=self.OnButtonClick)
   button.grid(column=5, row=0)

   self.labelVariable = Tkinter.StringVar()
   label = Tkinter.Label(self, textvariable=self.labelVariable,
     anchor="w", fg="white", bg="blue")
   label.grid(column=0, row=2, columnspan=2, sticky='EW')
   self.labelVariable.set(u"Hello !")




   self.grid_columnconfigure(0, weight=1)
   self.resizable(True, False)
   self.update()
   self.geometry(self.geometry())
   self.entry1.focus_set()
   self.entry1.selection_range(0, Tkinter.END)

 def OnButtonClick(self):
   #self.labelVariable.set(self.entryVariable1.get()+self.entryVariable2.get()+" (You clicked the button !")
   self.labelVariable.set(a1)   ****
   self.entry1.focus_set()
   self.entry1.selection_range(0, Tkinter.END)

 def OnPressEnter(self, event):
   #self.labelVariable.set(self.entryVariable1.get()+self.entryVariable2.get()+" (You pressed enter !")
   self.labelVariable.set(b1)   ****
   self.entry1.focus_set()
   self.entry1.selection_range(0, Tkinter.END)

if __name__ == "__main__":
 app = simpleapp_tk(None)
 app.title('matriseGUI')
 app.mainloop()

 

 

 

Lenke til kommentar

Ja ryddet opp litt,bruk 4 space indent.

Det er det nesten alle bruker,er en standar for python les pep-8.

Nå er det bedere og lage dette fra bånn enn og prøve og plassere noe kode inn i et tutorial som er for noe annet.

Kan skrive en wxpython versjon.

 

import Tkinter
import fractions

class simpleapp_tk(Tkinter.Tk):
 def __init__(self,parent):
   Tkinter.Tk.__init__(self,parent)
   self.parent = parent
   self.initialize()

 def initialize(self):
   self.grid()
   self.entryVariable1 = Tkinter.StringVar()

   #---
   self.entry1 = Tkinter.Entry(self, textvariable=self.entryVariable1)
   self.entry1.grid(column=0, row=0, sticky='EW')

   button = Tkinter.Button(self, text=u"Click me !",
     command=self.OnButtonclick)
   button.grid(column=2, row=0)

   self.labelVariable = Tkinter.StringVar()
   label = Tkinter.Label(self, textvariable=self.labelVariable,
     anchor="w", fg="white", bg="blue")
   label.grid(column=0, row=2, columnspan=2, sticky='EW')
   self.labelVariable.set(u"")

   self.grid_columnconfigure(0, weight=1)
   self.resizable(True, False)
   self.update()
   self.geometry(self.geometry())
   self.entry1.focus_set()
   self.entry1.selection_range(0, Tkinter.END)

 def OnButtonclick(self):
   #--
   try:
     x = self.entry1.get()
     a1 = fractions.Fraction(x)
     self.labelVariable.set(a1)
   except ValueError:
     self.labelVariable.set('Numeric values only')

   self.entry1.focus_set()
   self.entry1.selection_range(0, Tkinter.END)

if __name__ == "__main__":
 app = simpleapp_tk(None)
 app.title('my application')
 app.mainloop()

 

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...