2017-06-26 1 views
0

Si ceci est mon code:Canvas Python Tkinter remplirons fenêtre Tk() au départ ou lorsque redimensionnée, mais ne

from tkinter import * 
    class Program: 
     def __init__(self): 
      self.tk = Tk() 
      self.tk.attributes("-topmost", 1) 
      self.canvas = Canvas(self.tk, height=500, width=500, highlightthickness=0) 
      self.canvas.pack(fill="both", expand=1) 
      self.width = 500 
      self.height = 500 
      self.tk.bind("<Configure>", self.resize) 
      self.input = Entry(self.tk) 
      self.input.pack(fill="x", expand=1) 
      self.button = Button(self.tk, text="Start!", command=self.pressed) 
      self.button.pack(fill="x", expand=1) 
      self.pressed = 0 
      self.start = time() 
     def mainloop(self): 
      while 1: 
       self.canvas.delete("all") 
       self.canvas.create_rectangle(0, 0, self.width, self.height, fill="#4dffff", width=0) 
       self.tk.update() 
     def pressed(self): 
      self.pressed = 1 
     def resize(self, event): 
      self.width = event.width 
      self.height = event.height 
Program().mainloop() 

Si je le lance alors cette fenêtre ouvre: Initial Program

Si je puis déplacer la fenêtre, il ressemble à ceci: enter image description here

dès que je redimensionner (par exemple plein écran) Je reçois cette fenêtre: enter image description here

Comment devrais-je modifier le code pour avoir le résultat cohérent où le canevas (je veux dire la partie colorée) couvre la partie non couverte de la fenêtre Tk()?

+0

On dirait un double de [Comment redimensionner dynamiquement la toile] (https://stackoverflow.com/questions/22835289/how-to- get-tkinter-canvas-to-dynamiquement-resize-to-window-width). –

+0

Copie possible de [Comment faire pour redimensionner dynamiquement la toile tkinter à la largeur de la fenêtre?] (Https://stackoverflow.com/questions/22835289/how-to-get-tkinter-canvas-to-dynamically-resize-to-window -width) –

+0

pourquoi créez-vous votre propre 'mainloop'? –

Répondre

0

Vous avez beaucoup de code erroné et/ou inutile qui cause toutes sortes de problèmes. Cela se résume au fait que vous ne devriez pas créer votre propre mainloop. Utilisez celui fourni par Tkinter sauf si vous comprenez profondément pourquoi c'est le cas.

Commencez par ce code avant d'essayer de faire autre chose:

from tkinter import * 
from time import time 

class Program: 
    def __init__(self): 
     self.tk = Tk() 
     self.tk.attributes("-topmost", 1) 

     self.canvas = Canvas(self.tk, height=500, width=500, highlightthickness=0) 
     self.input = Entry(self.tk) 
     self.button = Button(self.tk, text="Start!", command=self.pressed) 

     self.button.pack(side="bottom", fill="x", expand=0) 
     self.input.pack(side="bottom", fill="x", expand=0) 
     self.canvas.pack(fill="both", expand=1) 

     self.pressed = 0 
     self.start = time() 

    def begin(self): 
     self.tk.mainloop() 

    def pressed(self): 
     self.pressed = 1 

Program().begin() 
+0

Dois-je ajouter plus de code dans la méthode begin ou en dehors de la classe dans ce cas et devez-vous répéter (loop) de façon répétée self.tk.mainloop ()? –

+0

@RonLauterbach: tout dépend de ce "code supplémentaire" dont vous parlez. En général je dirais non, il n'y a pas besoin de plus de code dans 'begin'. Non, vous n'avez pas besoin de répéter (loop) de façon répétée self.tk.mainloop() '. Comme son nom l'indique, il s'agit déjà d'une boucle, vous devriez appeler' mainloop' exactement une fois. –