2017-04-12 34 views
1

我有一個問題,爲什麼我的文字windget不會在這段代碼收拾妥當。對於記錄,它應該讀取用戶Documents文件夾中的日誌文件,並在Text小部件中顯示內容,給紅色警告和錯誤和藍色信息着色。任何幫助將不勝感激 !蟒蛇和Tkinter的:文本控件我使用的是不「包」

這是我想出了新的代碼,但文字小部件不主框架內包...

#!/usr/bin/python3 
import tkinter as tk 
import sys 
import time 
from os.path import expanduser 

def get_log_path(): 
    p = "" 
    if sys.platform == "linux" or sys.platform == "linux2": 
     p = expanduser("~/.local/share/binding of isaac afterbirth+/log.txt") 
    elif sys.platform == "darwin": 
     p = expanduser("~/Library/Application Support/Binding of Isaac Afterbirth+/log.txt") 
    elif sys.platform == "win32": 
     p = expanduser("~/Documents/My Games/binding of isaac afterbirth+/log.txt") 
    return p 
    pass 

class GUI(tk.Frame): 
    def __init__(self, master=None): 
     super(GUI, self).__init__() 
     self.master = master 
     self.start_stop = False 
     self.log_path = get_log_path() 
     self.output = tk.Text(self) 
     self.menubar = tk.Menu(master) 
     self.menubar.add_command(label="Start", command=self.start) 
     self.menubar.add_command(label="Stop", command=self.stop) 
     master.config(menu=self.menubar) 
     self.oldline = " " 
     self.init_layout() 
     pass 

    def init_layout(self): 
     self.output.config(font="sans 12", width=200, height=60, state = tk.DISABLED) 
     self.output.tag_config("error", foreground="#FF0000") 
     self.output.tag_config("info", foreground="#0000FF") 
     self.output.pack() 
     self.readfile() 
     pass 

    def readfile(self): 
     if self.start_stop: 
      tmp = self.log_f.readline().lower() 
      if self.oldline != tmp: #display spam only [email protected] 
       if "err" in tmp or "error" in tmp or "warn" in tmp and not "overlayeffect" in tmp and not "animation" in tmp: #Error filter to display 
        #print(tmp, end='', file=sys.stderr) 
        self.output.insert(tk.END, tmp) 
        index = "end - 1 lines" 
        self.output.tag_add("error", index) 
       elif "lua" in tmp: 
        self.output.insert(tk.END, tmp) 
        index = "end - 1 lines" 
        self.output.tag_add("info", index) 
       self.oldline = tmp 
      self.after(5, self.readfile) 
      pass 
     pass 
    def start(self): 
     self.log_f = open(self.log_path, "r") 
     self.start_stop = True 
     self.readfile() 
     pass 
    def stop(self): 
     self.log_f.close() 
     self.start_stop = False 
     pass 
    pass 

if __name__ == "__main__": 
    root = tk.Tk() 
    root.title("Isaac Debug Helper") 
    root.geometry("650x500") 
    gui = GUI(root) 
    gui.mainloop() 

而且還有供參考的舊代碼:

#!/usr/bin/python3 
import tkinter as tk 
import sys 
import time 
from os.path import expanduser 

def get_log_path(): 
    p = "" 
    if sys.platform == "linux" or sys.platform == "linux2": 
     p = expanduser("~/.local/share/binding of isaac afterbirth+/log.txt") 
    elif sys.platform == "darwin": 
     p = expanduser("~/Library/Application Support/Binding of Isaac Afterbirth+/log.txt") 
    elif sys.platform == "win32": 
     p = expanduser("~/Documents/My Games/binding of isaac afterbirth+/log.txt") 
    return p 
    pass 

class GUI(tk.Frame): 
    def __init__(self, master=None): 
     super(GUI, self).__init__() 
     self.master = master 
     self.start_stop = True 
     self.log_path = get_log_path() 
     self.output = tk.Text(self) 
     self.frame=tk.Frame() 
#  self.reloadButton = tk.Button(self.frame, text="Reload", command=self.reload) 
     self.startButton = tk.Button(self.frame, text="Start", command=self.start) 
     self.stopButton = tk.Button(self.frame, text="Stop", command=self.stop) 
     self.oldline = " " 
     self.init_layout() 
     pass 

    def init_layout(self): 
     self.output.pack(side=tk.LEFT)#, fill=tk.BOTH, expand=1) 
     self.output.config(font="sans 12", width=200, height=60, state = tk.DISABLED) 
     self.output.tag_config("error", foreground="#FF0000") 
     self.output.tag_config("info", foreground="#0000FF") 
     self.frame.pack(side=tk.RIGHT) 
#  self.reloadButton.pack(in_=self.frame) 
     self.startButton.pack(in_=self.frame) 
     self.stopButton.pack(in_=self.frame) 
     self.readfile() 
     pass 

    def readfile(self): 
     if self.start_stop: 
      with open(self.log_path, "r") as f: 
       tmp = f.readline().lower() 
       if self.oldline != tmp: #display spam only [email protected] 
        if "err" in tmp or "error" in tmp or "warn" in tmp and not "overlayeffect" in tmp and not "animation" in tmp: #Error filter to display 
         #print(tmp, end='', file=sys.stderr) 
         self.output.insert(tk.END, tmp) 
         index = "end - 1 lines" 
         self.output.tag_add("error", index) 
        elif "lua" in tmp: 
         self.output.insert(tk.END, tmp) 
         index = "end - 1 lines" 
         self.output.tag_add("info", index) 
        self.oldline = tmp 
       pass 
      self.after(5, self.readfile) 
      pass 
     pass 
# def reload(self): 
#  pass 
    def start(self): 
     self.start_stop = True 
     self.readfile() 
     pass 
    def stop(self): 
     self.start_stop = False 
     pass 
    pass 

if __name__ == "__main__": 
    root = tk.Tk() 
    root.title("Isaac Debug Helper") 
    root.geometry("650x500") 
    gui = GUI(root) 
    gui.mainloop() 
+0

你可以給我們的錯誤訊息?還是沒有? – Cribber

+0

你能更具體地說明哪些包裝不合適嗎? – WhatsThePoint

+0

也許我錯了,但不應該self.output.pack()後self.output.config()? – Cribber

回答

0

工作完整的代碼在這裏,感謝所有幫助過的人!

#!/usr/bin/python3 
import tkinter as tk 
import sys 
import time 
from os.path import expanduser 

def get_log_path(): 
    p = "" 
    if sys.platform == "linux" or sys.platform == "linux2": 
     p = expanduser("~/.local/share/binding of isaac afterbirth+/log.txt") 
    elif sys.platform == "darwin": 
     p = expanduser("~/Library/Application Support/Binding of Isaac Afterbirth+/log.txt") 
    elif sys.platform == "win32": 
     p = expanduser("~/Documents/My Games/binding of isaac afterbirth+/log.txt") 
    return p 
    pass 

class GUI(tk.Frame): 
    def __init__(self, master=None): 
     super(GUI, self).__init__() 
     self.master = master 
     self.start_stop = False 
     self.log_path = get_log_path() 
     self.output = tk.Text(self) 
     self.menubar = tk.Menu(self) 
     self.menubar.add_command(label="Start", command=self.start) 
     self.menubar.add_command(label="Stop", command=self.stop) 
     master.config(menu=self.menubar) 
     self.oldline = " " 
     self.init_layout() 
     pass 

    def init_layout(self): 
     self.output.config(font="sans 10", width=200, height=60) 
     self.output.tag_config("error", foreground="#FF0000") 
     self.output.tag_config("warning", foreground="#00FF00") 
     self.output.tag_config("info", foreground="#0000FF") 
     self.output.pack() 
     self.readfile() 
     pass 

    def readfile(self): 
     if self.start_stop: 
      tmp = self.log_f.readline().lower() 
      if self.oldline != tmp: #display spam only [email protected] 
       self.output.config(state=tk.NORMAL) 
       if "err" in tmp or "error" in tmp and not "overlayeffect" in tmp and not "animation" in tmp: #Error filter to display 
        self.output.insert(tk.END, tmp, "error") 
       elif "lua" in tmp: 
        self.output.insert(tk.END, tmp, "info") 
       elif "warn" in tmp: 
        self.output.insert(tk.END, tmp, "warning") 
       self.oldline = tmp 
      self.output.see(tk.END) 
      self.update_idletasks() 
      self.after(5, self.readfile) 
      pass 
     pass 
    def start(self): 
     self.log_f = open(self.log_path, "r") 
     self.start_stop = True 
     self.readfile() 
     pass 
    def stop(self): 
     self.log_f.close() 
     self.start_stop = False 
     pass 
    pass 

if __name__ == "__main__": 
    root = tk.Tk() 
    root.title("Isaac Debug Helper") 
    root.geometry("650x500") 
    gui = GUI(root) 
    gui.pack() 
    gui.mainloop() 
+0

你忽略將'master'傳遞給'super(GUI,self).__ init __()'。在這種特殊情況下它是無害的,因爲沒有一個主人像主人一樣擁有'root',但是總的來說,你應該習慣把它傳遞出去。 –