[Tutor] Shorten this code

Mic o0MB0o at hotmail.se
Sun Nov 27 13:17:17 CET 2011


God morning!

>That's right, because your SeatButton init doesn't check to see if a
>file exists for it, it always colors it green. You need to read the
>directory and see whether a file for that seat exists. If it does
>color it red. (Hint: look at os.path.exists() )


Alright, I think I now managed to solve this problem. Here is the code:

from tkinter import*
import tkinter as tk
import os

FREE = "green"
OCCUPIED = "red"

class Mainwindow(Frame):
     def __init__(self,master):
         super(Mainwindow,self).__init__(master)
         self.grid()
         self.create_mainwidgets()

     def create_mainwidgets(self):
         self.klicka=Button(self, text="Press the button",
                            command=self.uppdatera)
         self.klicka.grid()

     def uppdatera(self):
         SeatWindow(root)

class SeatButton(tk.Button):
     def __init__(self, master, index):
         text = str(index+1)
         super(SeatButton, self).__init__(master,
                                          text=text, bg=FREE,
                                          command=self.clicked)
         self.filename = "Germany_France{}.txt".format(index+1)
         self.occupied = False
         if os.path.exists(self.filename):
              self["bg"]=OCCUPIED

     def clicked(self):
         self.occupied = not self.occupied
         if self.occupied:
             self["bg"] = OCCUPIED
             text_file=open(self.filename,"w")
             text_file.write(self.filename)
             text_file.close()
         else:
             self["bg"] = FREE
             os.remove(self.filename)

class SeatWindow(tk.Toplevel):
      def __init__(self, master):
          super (SeatWindow, self).__init__(master)
          self.grid()
          self.create_widgets()

      def create_widgets(self):
          for index in range(20):
              button = SeatButton(self, index)
              row, column = divmod(index, 4)
              button.grid(row=row, column=column)

root=Tk()
root.title("testV2")
app=Mainwindow(root)
root.mainloop()





>This is one case where I think it will be easier to show you than tell
>you so I've pasted my modified version of your code. Note that I've
>moved all the clsses to the outer level and made the second window(which
>I've renamed SeatWindow) inherit from Toplevel rather than Frame so that
>you can create it as a child of the Mainwindow. That then allows a
>single mainloop. It will be worth while studying the differences to see
>if you understand why I've done what I've done.


>>Yeah, well, the main difference I can see is that you only uses one tk 
>>object while I used more. Hmm, otherwise I can see that you have bound the 
>>button in the main window to the function
def uppdatera(self):
         SeatWindow(root)
which opens the SeatWindow right? I probably missed things, but I noticed 
that this is much smoother than my alternative!


Thanks !

Mic





More information about the Tutor mailing list