2017-01-09 4 views
1

Ich programmiere ein Programm, das Funktionen benötigt, um Etiketten zu ändern und Text in Textfelder einzugeben, aber ich weiß nicht, wie ich das mit einem neuen Programmierstil, den ich verwende (Object Oriented), mache. Ich habe das Programm getan, bevor ich aber die Frames mit diesem Code generiert:Objektorientierte Tkinter-Funktionen - Wie würde ich das machen?

f = [Frame(root) for i in range(0,5)] 
for i in f: 
    i.place(relx=0,rely=0,relwidth=1,relheight=1) 

und ich habe es dann alle in einer Klasse, die ich aber lief die schlechte Form war, damit ich es bin redoing. Mein Code ist so weit wie folgt:

import tkinter as tk 
import datetime,time,os,sys 
import sqlite3 as lite 
from datetime import date 

Title_Font= ("Times", 18, "underline italic") 

unix = time.time() 
time_curr = str(datetime.datetime.fromtimestamp(unix).strftime('%H:%M')) 
date1 = str(datetime.datetime.fromtimestamp(unix).strftime('%d-%m-%Y')) 


class Creating_Stuff(tk.Tk): 

    def __init__(self, *args, **kwargs): 

     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 


     container.pack(side="top", fill="both", expand = True) 

     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (StartPage, PageOne, PageTwo): 

      frame = F(container, self) 

      self.frames[F] = frame 

      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame(StartPage) 

    def show_frame(self, cont): 

     frame = self.frames[cont] 
     frame.tkraise() 

class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 
     self.grid_columnconfigure(0, weight=1) 
     self.grid_columnconfigure(3, weight=1)  

     self.option_add("*font", "Times 12") 
     self.tk_setPalette(background='#bbfff0', foreground='black', 
       activeBackground='#d9d9d9', activeForeground='#ff9933') 


     label = tk.Label(self, text="Laptop Booking System", font=Title_Font) 
     label.grid(row=0, column=1, pady = 30) 

     time = tk.Label(self, text="Time: " + time_curr + "\nDate: " + date1, font="Times 10") 
     time.grid(row=0, column=2,columnspan=2) 

     Booking_1 = tk.Button(self, text="Booking", 
          command=lambda: controller.show_frame(PageOne),bg='#f2f2f2',width=20) 
     Booking_1.grid(row=2, column=1, pady=10) 

     Tbl_q1 = tk.Button(self, text="Table Querying", 
          command=lambda: controller.show_frame(PageTwo),bg='#f2f2f2',width=20) 
     Tbl_q1.grid(row=3, column=1, pady=10) 

     Exit = tk.Button(self, text ="Exit",command=lambda:destroy(),bg='#f2f2f2') 
     Exit.grid(row=5, column=1) 


class PageOne(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.grid_columnconfigure(0, weight=1) 
     self.grid_columnconfigure(3, weight=1) 
     label = tk.Label(self, text="Page One!!!", font=Title_Font) 
     label.grid(row=1, column=1) 


     bk2_menu = tk.Button(self, text="Back to Home", 
          command=lambda: controller.show_frame(StartPage)) 
     bk2_menu.grid(row=3, column=1) 



class PageTwo(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.grid_columnconfigure(0, weight=1) 
     self.grid_columnconfigure(3, weight=1) 
     label = tk.Label(self, text="Page Two!!!", font=Title_Font) 
     label.grid(row=1, column=1) 


     bk2_Menu2 = tk.Button(self, text="Back to menu", 
          command=lambda: controller.show_frame(StartPage)) 
     bk2_Menu2.grid(row=3, column=1) 



app = Creating_Stuff() 
def destroy(): 
    app.destroy() 

app.title("Laptop Booking System") 
app.geometry("700x400") 
app.mainloop() 

Wenn Sie es ausprobieren, funktioniert es aber es hat nur 3 verschiedene Frames. Wie kann ich einen Button in einem Frame bekommen, damit ein Label im Frame "Hallo" sagt, nachdem es gedrückt wurde?

Antwort

1

Ich habe eine Ihrer Seitenklassen geändert, um zu veranschaulichen, wie es gemacht werden könnte. Es umfasste das Hinzufügen einer Label, um die Nachricht zu halten, eine Button, um es zu steuern, und eine Funktion, die einfach handler() genannt wird, um anzurufen, wenn die letztere gedrückt wird. Er speichert die Widgets, indem er sie zu Attributen der enthaltenen Unterklasseninstanz Frame, self, macht, sodass sie leicht in der handler()-Funktion referenziert werden können (ohne auf globale Variablen zurückgreifen zu müssen).

class PageOne(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.grid_columnconfigure(0, weight=1) 
     self.grid_columnconfigure(3, weight=1) 
     label = tk.Label(self, text="Page One!!!", font=Title_Font) 
     label.grid(row=1, column=1) 

     self.msg_label = tk.Label(self, text="") 
     self.msg_label.grid(row=2, column=1) 
     self.msg_button = tk.Button(self, text='Show Message', 
            command=self.handler) 
     self.msg_button.grid(row=3, column=1) 
     self.msg_toggle = False 

     bk2_menu = tk.Button(self, text="Back to Home", 
          command=lambda: controller.show_frame(StartPage)) 
     bk2_menu.grid(row=5, column=1) 

    def handler(self): 
     self.msg_toggle = not self.msg_toggle 
     if self.msg_toggle: 
      self.msg_label.config(text='Hello') 
      self.msg_button.config(text='Clear Message') 
     else: 
      self.msg_label.config(text='') 
      self.msg_button.config(text='Show Message') 

Screenshots

Vor-Taste gedrückt wird:

screenshot showing before button is pressed

Nach Taste gedrückt wird:

screenshot showing before button is pressed

+0

Legende! Vielen Dank! – DestinyBob

+0

Gern geschehen. Basierend auf dem, was Sie anscheinend tun, finden Sie möglicherweise auch die Frage [_Switch zwischen zwei Frames in tkinter_] (http://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter) interessant Ich weiß, dass ich es getan habe. – martineau

+1

Werde einen Blick darauf werfen! Vielen Dank! – DestinyBob

Verwandte Themen