2014-07-11 139 views
1

快速項目摘要:使用Tkinter製作一個python窗口小部件,顯示來自多個json和txt文件的數據。需要在Windows中工作。 我在哪裏在:一切都很好與json文件。但是我遇到了txt文件的麻煩。我可以分析,我需要一些必要的文件,此代碼的信息:獲取命令窗口輸出,以使用tkinter顯示在窗口小部件中

from Tkinter import * 
import re 


results = open("sample_results.txt", "r") 

for line in results: 
    if re.match("(.*)test(.*)", line): 
     print line 
    if re.match("(.*)number(.*)", line): 
     print line 
    if re.match("(.*)status(.*)", line): 
     print line 
    if re.match("(.*)length(.*)", line): 
     print line 

問題:它不顯示在一個單獨的部件在命令shell中的所有數據。

我想簡單地將所有這些信息從命令shell移動到文本框小部件(或tkmessage小部件,但我覺得文本框會更合適)。一個非常長的谷歌搜索過程給了我很多代碼不起作用 - 任何提示?謝謝!

注:這是不是所有的代碼 - 只是我需要幫助固定

回答

2

這裏是我想你希望你的應用程序打開文件並解析它們,對於每一個分析過的行,你都希望它插入文本(或者附加文本)到一個文本控件中,我會爲每個文件類型創建一個方法來做然後我會遍歷每個文件並根據需要調用解析器,當您完成解析時,可以調用

self.textbox.insert(tkinter.END, parsed_text) 

另一種方法是將stdout重定向到文本控件,然後打印解析的行。我發現後一種方法更靈活一些,尤其是當我想用子進程調用一個單獨的程序並逐位讀取其輸出時。下面是用Tkinter的做到這一點的一種方法:

import ScrolledText 
import sys 
import tkFileDialog 
import Tkinter 


######################################################################## 
class RedirectText(object): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, text_ctrl): 
     """Constructor""" 
     self.output = text_ctrl 

    #---------------------------------------------------------------------- 
    def write(self, string): 
     """""" 
     self.output.insert(Tkinter.END, string) 


######################################################################## 
class MyApp(object): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     self.root = parent 
     self.root.title("Redirect") 
     self.frame = Tkinter.Frame(parent) 
     self.frame.pack() 

     self.text = ScrolledText.ScrolledText(self.frame) 
     self.text.pack() 

     # redirect stdout 
     redir = RedirectText(self.text) 
     sys.stdout = redir 

     btn = Tkinter.Button(self.frame, text="Open file", command=self.open_file) 
     btn.pack() 

    #---------------------------------------------------------------------- 
    def open_file(self): 
     """ 
     Open a file, read it line-by-line and print out each line to 
     the text control widget 
     """ 
     options = {} 
     options['defaultextension'] = '.txt' 
     options['filetypes'] = [('all files', '.*'), ('text files', '.txt')] 
     options['initialdir'] = '/home' 
     options['parent'] = self.root 
     options['title'] = "Open a file" 

     with tkFileDialog.askopenfile(mode='r', **options) as f_handle: 
      for line in f_handle: 
       print line 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    root = Tkinter.Tk() 
    root.geometry("800x600") 
    app = MyApp(root) 
    root.mainloop() 
+0

出於某種原因,我無法得到你的第一個建議'self.textbox.insert(tkinter.END,parsed_text'''正常工作,但你的'更靈活'的方法運行得非常好,非常感謝你的幫助! – Isa

0

一種方法是使用一個簡單的Tkinter的標籤部分:

# somewhere in your main class, I suppose: 
self.log_txt = tkinter.StringVar()                                                          
self.log_label = tkinter.Label(self.inputframe, textvariable=self.log_txt, justify=tkinter.LEFT)                                          
self.log_label.pack(anchor="w") 

然後,一個非常簡單的方法,用於將文本進入該標籤:

def log(self, s):                                                               
    txt = self.log_txt.get() + "\n" + s                                                         
    self.log_txt.set(txt) 

或者,您可以使用tkinter.Text小部件。在這種情況下,您可以使用插入方法插入文本:

self.textbox = tkinter.Text(parent) 
self.textbox.insert(tkinter.END, "some text to insert") 

我喜歡的一種資源是http://effbot.org/tkinterbook/text.htm。遺憾的是,相當難以從文本去工作Python代碼:(

0

這裏是一個醜陋的小Tkinter的GUI一個小例子程序,增加了文本到文本框:

#!/usr/bin/env python 

try: 
    import tkinter 
except ImportError: 
    import Tkinter as tkinter 
import _tkinter 
import platform 

class TextBoxDemo(tkinter.Tk): 
    def __init__(self, parent): 
     tkinter.Tk.__init__(self, parent) 
     self.parent = parent 
     self.wm_title("TextBoxDemo") 
     self.textbox = tkinter.Text(self) 
     self.textbox.pack() 

     self.txt_var = tkinter.StringVar() 
     self.entry = tkinter.Entry(self, textvariable=self.txt_var) 
     self.entry.pack(anchor="w") 

     self.button = tkinter.Button(self, text="Add", command=self.add) 
     self.button.pack(anchor="e") 


    def add(self): 
     self.textbox.insert(tkinter.END, self.txt_var.get()) 


if __name__ == '__main__': 
    try: 
     app = TextBoxDemo(None) 
     app.mainloop() 
    except _tkinter.TclError as e: 
     if platform.system() == 'Windows': 
      print(e) 
      print("Seems tkinter will not run; try running this program outside a virtualenv.") 
+0

此代碼有效,但不回答我的問題。不管怎麼說,還是要謝謝你。 – Isa

-1

http://tkinter.unpythonic.net/wiki/CmdTk

在這裏你走這是你想要的,都在這裏其他的答案是從這裏直接複製粘貼。 http://www.tagwith.com/question_1154381_get-command-window-output-to-display-in-widget-with-tkinter而大多數不工作XD。

+0

這個答案似乎完全沒有任何關於被問到的問題。你可以鏈接到一些代碼來運行一個外部命令並在窗口中顯示該輸出,但是這個問題並沒有提到有關運行外部命令的任何信息。 –

+0

「獲取命令窗口輸出顯示在小部件與tkinter」 線程在第一個鏈接的標題, 「將cmd.exe嵌入到Tkinter.Frame」 我很確定這正是他/她所要求的。 –

+0

順便說一句,感謝downvote,真的讓我想幫助更多的人× –

相關問題