2016-05-20 47 views
1

「Time Range」ボタンを押してcalculateTime関数を呼び出した後に、テキストウィジェットに挿入した結果が表示されるそれ。しかしその後、GUIウィンドウを閉じるたびにプログラムがフリーズし、強制終了する必要があります。私はこのトピックにアップ検索しようとしましたが、私は本当にすべての奇妙な更新()関数を使用していない、とテキストは、関数が終了した後に表示されるので、どのように可能性がテキストウィジェットが開いた後、tkinter GUIがクラッシュしたときにクラッシュする/応答しない

import tkinter 
from tkinter import * 
import math 
from tkinter import messagebox 


class MyClass(tkinter.Frame): 
    def __init__(self, *args, **kwargs): 
     tkinter.Frame.__init__(self, *args, **kwargs) 

     #Setting up frame and widgets 

     vcmd1 = (self.register(self.__vcmd1), '%P', '%S') 
     vcmd2 = (self.register(self.__vcmd2), '%P') 
     vcmd3 = (self.register(self.__vcmd3), '%P', '%S') 

     label_iso = Label(self,text="Isotope A, Element") 
     label_vol = Label(self, text="Voltage") 
     label_range = Label(self, text="Charge Range") 

     label_iso.grid(row=0, column=0, sticky=E) 
     label_vol.grid(row=1, column=0, sticky=E) 
     label_range.grid(row=2, column=0, sticky=E) 

     self.entry1 = tkinter.Entry(self, validate="key", validatecommand=vcmd1) 
     self.entry2 = tkinter.Entry(self, validate="key", validatecommand=vcmd2) 
     self.entry3 = tkinter.Entry(self, validate="key", validatecommand=vcmd3) 

     self.entry1.grid(row=0, column=1) 
     self.entry2.grid(row=1, column=1) 
     self.entry3.grid(row=2, column=1) 

    def __vcmd1(self, P, S): 
     validString = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM,1234567890' 
     if not S in validString: 
      return False 
     if "," in P: 
      if (len(P) - 1) > len(P.replace(",","")): 
       return False 
       messagebox.showinfo("Error", "Expected Form: ex. 133,Cs") 
     else: 
      return True 

    def __vcmd2(self, P): 
     if P == '': 
      return True 
     try: 
      float(P) 
      return True 
     except ValueError: 
      messagebox.showinfo("Error", "Entry is not a float or integer") 
      return False 


    def __vcmd3(self, P, S): 
     if "," in P: 
      if len(P.split(",")) > 2: 
       return False 
      a = P.split(",")[0] 
      b = P.split(",")[1] 
      if a != '' and b != '': 
       try: 
        int(a) 
        int(b) 
       except ValueError: 
        messagebox.showinfo("Error", "Expected form: ex. 1,12") 
        return False 
     else: 
      return True 

class TimeGenerator: 

    def __init__(self,master): 

     frame = MyClass(master) 
     frame.grid(columnspan=2) 

     button = Button(root, text='Time Range', command=self.calculateTime) 
     button.grid(row=3, columnspan=2) 

     self.text = Text(root) 
     self.iso = frame.entry1 
     self.vol = frame.entry2 
     self.r = frame.entry3 

    def calculateTime(self): 
     x = 5 
     if self.r.get() == "" or self.iso.get() == "" or self.vol.get() == "": 
      messagebox.showinfo("Error", "No field can be empty") 
      return None 

     self.iso = self.iso.get().replace(" ", "") 
     list = [] 
     for e in self.iso.split(","): 
      list.append(e) 

     f = open("/Users/LazyLinh/PycharmProjects/mass.mas12.txt", "r") 
     i = 0 
     while (i < 40): 
      header = f.readline() 
      i += 1 
     self.mass = 0 

     #iterate through text file 

     for line in f: 
      line = line.strip() 
      columns = line.split() 
      if (list[0] == columns[3]): 
       if (list[1].lower() == columns[4].lower()): 
        if (len(columns) == 16): 
         self.mass = float(columns[13].replace("#","")) + float(columns[14].replace("#","")) 
        else: 
         self.mass = float(columns[12].replace("#","")) + float(columns[13].replace("#","")) 

     #Calculation 
     self.r = self.r.get().replace(" ", "") 
     tup = tuple(int(x) for x in self.r.split(",")) 

     list = [] 
     for q in range(tup[0], tup[1] + 1): 
      y = (x * math.sqrt(self.mass * 1.6605402e-27/(2 * q * float(self.vol.get())))) * 10e6 
      list.append(y) 
     i = tup[0] 

     #inserting to text widget 
     for time in list: 
      self.text.insert("end", "%d: %s\n" % (i, time)) 
      i = i + 1 
     self.text.pack() 

root = Tk() 
b = TimeGenerator(root) 
root.mainloop() 

:これは私のコードですそれはイベントループの問題ですか?この問題を引き起こす可能性のある何か間違ったこともしていますか?

ありがとうございました!

答えて

1

ルートウィンドウにpackgridの両方を使用するウィジェットがあります。あなたはこれをすることはできません。特定のコンテナ(ルートウィンドウ、フレームなど)内で、どちらか一方を使用できますが、両方を使用することはできません。

あなたのプログラムがフリーズする理由は、packgridがレイアウトを制御するために戦っているためです。テキストウィジェットをパックすると、ルートウィンドウ内の他のウィジェットのサイズや位置が変更されます。これにより、担当するウィジェットを再レイアウトしようとするgridがトリガーされます。これにより、担当するウィジェットを再レイアウトしようとするとpackがトリガされ、終了するまでオンとなります。

他のすべての地域でgridを使用しているので、gridself.textを使用する必要があります。

+0

うわーは魅力的に機能しました!ありがとうございました!!! –

関連する問題