2017-06-01 4 views
0

私はtkinterには新しく、「エントリ」、画像付きのキャンバス、ボタンでtkinterインターフェイスを作成したいと考えています。私は1つのtkウィンドウしか期待していませんでしたが、私のコードを実行すると2番目の小さな空のtkウィンドウがあります。私はそれがために私が使用したクラスであると思いますが、私はわからないんだけど...。ここ が私のコードです:1つではなく2つのtkウィンドウ

from tkinter import* 
import tkinter as tk 
import time 

class Application(Tk): 
    def __init__(self,transfo,nb_itération): 
     Tk.__init__(self) 
     self.transfo = transfo 
     self.nb_itération = nb_itération 



    def affichage_graphique(self): 

     self.matrix_hex = extraction_rgb(tk.PhotoImage(file='obama_128.gif')) 
     self.width , self.height = len(self.matrix_hex[0]) , len(self.matrix_hex) 
     self.WIDTH, self.HEIGHT = 8*self.width+6, 8*self.height+6 
     self.cnv = Canvas(self, width=self.WIDTH, height=self.HEIGHT, bg='white',highlightthickness=0) 
     self.cnv.grid(row = 2 , columnspan = 3) 
     self.txt1 = Label(self, text = 'Transformation :').grid(row = 0 , sticky = E) 
     self.txt2 = Label(self, text = 'Nombre d\'itérations : ').grid(row = 1 , sticky = E) 
     self.entr1 = Entry(self) 
     self.entr2 = Entry(self) 

     self.entr1.grid(row = 0, column = 1, sticky = W) 
     self.entr2.grid(row = 1, column = 1, sticky = W) 
     Button(self, text="Quitter", command=self.destroy).grid(row = 0 , column = 2) 

     if self.transfo == photomaton or self.transfo == boulanger: 

      print("valeur par défaut mauvaise") 
      self.cnv.delete(ALL) 
      self.img01 = self.PhotoImage(width=self.width*4, height=self.height*4) 
      self.img = self.PhotoImage(width=self.width*4, height=self.height*4) 

      self.matrix_hex4 = [[x for x in range(self.width*4)] for y in range(self.height*4)] 
      self.matrix_4 = [[x for x in range(self.width*4)] for y in range(self.height*4)] 


      self.img.put(data=self.matrix_4 , to=(0,0)) 
      self.cnv.create_image(0, 0, image=self.img, anchor=tk.NW) 

      self.img01.put(data=self.matrix_hex4, to=(0,0)) 
      self.cnv.create_image(self.WIDTH, 0, image=self.img01, anchor=tk.NE) 
      self.cnv.bind('<Button-1>',self.click_handler) 

     else: 

      self.img = tk.PhotoImage(width=self.width*4, height=self.height*4) 
      self.img.put(data=self.matrix_4 , to=(0,0)) 
      self.cnv.create_image(0, 0, image=self.img, anchor=tk.NW) 
      self.entr1.insert(0,"photomaton") 
      self.entr2.insert(0,"1") 
      self.entr2.bind("<Return>",Programme().Enter) 



class Programme(Application): 
    def __init__(self,transfo = 0, nb_itération = 0 ,orbites =[],période = []): 
     self.choice = 0 
     self.orbites = orbites 
     self.période = période 
     self.transfo = transfo 
     self.nb_itération = nb_itération 
     Application.__init__(self, self.transfo , self.nb_itération) 


    def Enter(self,event): 
     self.choix_transfo = self.entr1.get() 
     self.nb_itération = self.entr2.get() 
     return self.choix_transfo , self.nb_itération 

    def start(self): 
     self.affichage_graphique() 



prog = Programme() 
prog.start() 
prog.mainloop() 
+1

、[最小、コンプリートを投稿してください、および検証可能な例](https://stackoverflow.com/help/mcve)を参照してください。例えば、 'Program .__ init__'は引数リストの後にコロンがありません。また、 'Program .__ init__'には無限の再帰があります。 – FamousJameous

+0

私は、(a)あなたは 'Tk'を拡張するいくつかのクラスを持っているか、(b)' Tk'を拡張する一つのクラスを持っていて、 '' root ''Tk'インスタンスを手動で作成すると思います。あなたのコードにエラー(構文と実行時)があるので、チェックすることはできません。私は 'Tk'を全く拡張しないことをお勧めします。 –

+0

2つのウィンドウを作成するコードはありません。しかし、私はあなたの 'Program()'の使用を見ていますが、その名前でクラスや関数はありません。あなたは 'Program'という名前のクラスを持っています - それらのタイプミスの1つですか? –

答えて

2

問題は、このライン上にあるように思わ:

self.entr2.bind("<Return>",Programme().Enter) 

この行が持っています複数の問題:

  1. は、第2 Tkウィンドウを作成したがって、(これはタイプミスであると仮定して)Program()2番目のインスタンスを作成します(Programが伸びるのでTk
  2. は、それはあなたがおそらく

    を使用したい、ボタンがクリックされた場合のみならず、そうすぐを行い、そして

代わりに、ボタンにその新しいインスタンスのメソッドをバインドします

self.entr2.bind("<Return>", self.Enter) 

Enter電流Programインスタンスの方法、又は

self.entr2.bind("<Return>", lambda: Program().Enter) 
を呼び出します

もしあなたが実際にの場合は、ボタンをクリックしたときに2番目のProgramウィンドウを作成します。ただし、この場合は、ウィジェットを初期化するためにguiメソッドを呼び出す必要があります。そこのコメントで述べたように、いくつかの他の問題は、あなたのコードではありますが、私はそれらがそうでなければ、あなたがその動作を取得しません、あなたの実際のコードには存在しないことを前提としていること


注意。

+0

私は自分の質問を編集し、完全なコードを追加しました。 –

1

新しいウィンドウを2か所に作成しています。まず、これで:

prog = Programme() 

目はここにある:

self.entr2.bind("<Return>",Programme().Enter) 

なぜ?上記のコードは機能的にはこれと同じです:

プログラムクラスで定義された関数を呼び出す通常の方法は、既存の参照を使用することです。あなたのコードがProgrammeクラスに属するメソッドで実行されているので、あなたがこれを行うことができます:

はそれを実行しているから私を防ぐため、あなたのコード内のエラーのカップルがあります
self.entr2.bind("<Return>", self.Enter) 
+0

"entry.bind"メソッドはウィンドウを作成しますか?私はそれを避けるために何ができますか? Applicationクラスに "Enter"を入れますか? –

+0

あなたの助けにThx! –

+0

@NathanDubois:いいえ、 'entry.bind'はウィンドウを作成しません。' Program()。Enter'は 'Program()'がウィンドウを作るのでウィンドウを作ります。 –

関連する問題