用户界面-Python tkinter Entry小部件显示条形字符而不是换行符





我正在编写一个非常简单的Python Tkinter GUI来驱动命令行Python脚本
我的GUI将在Windows主机上运行,我希望它显示脚本的多行纯文本输出,该输出将作为包含换行符(n字符)的字符串返回到GUI。

因此,我在GUI中放入了一个Text小部件,当我的脚本(例如)返回以以下子字符串开头的输出时:

 nbsp nbsp;RESULT STATUS: OK- Service is currently runningnnDETAILS: ...

只要存在CCD_ 4换行字符,所显示的文本就包含黑色竖条(|)。

换行是正确的,但那些奇怪的条形图让我认为n换行字符没有正确解码,我不希望这些条形图出现在我显示的输出中。

你知道如何让Tkinter正确显示行尾吗?提前谢谢。

代码

这是我的GUI的工作流程:

  1. 我点击一个按钮,它调用callMe()回调函数
  2. callMe()函数解析来自Entry小部件的参数,然后调用python命令行脚本
  3. 脚本返回上面提到的字符串,回调使用它来更新text小部件的文本

这是代码:

#init the GUI elements and the Text widget
from Tkinter import *
root = Tk()     
top = Frame(root)
outputFrame = Frame(top)
outputFrame.pack(side='top', padx=20, pady=20)
outputTextArea = Text(outputFrame, yscrollcommand=scrollbar.set, width=150, height=40)
outputTextArea.pack(side='left', expand=YES, fill='both')
#callback executed when the button is clicked
def callMe()
    #get parameters
    # .....

    #command line execution script execution
    process = subprocess.Popen(command_line, stdout=subprocess.PIPE, shell=True)
    #get script output
    matr = process.stdout.readlines()  
    #from a list of strings to a single string
    output = "".join(matr)
    #write output into the Text widget
    outputTextArea.insert(0.0, output)

这可能是每个'\n'字符之前都有'\r'个字符的问题(您说您使用的是Windows)。

在更新小部件之前,请先尝试:

text_output= text_output.replace('r', '')

(text_output包含脚本的输出,其内容将插入小部件中)

如果你给我们更多的信息,我们可以为你提供更多的帮助。

何时使用入口小部件(来自http://effbot.org/tkinterbook/entry.htm)

输入小部件用于输入文本字符串。该小部件允许用户以单一字体输入一行文本。

要输入多行文本,请使用文本小部件。

如果看不到代码,就无法确定问题出在哪里。你说你使用了文本小部件,但行为似乎与使用条目小部件一致。你还看到下面代码的竖线吗?

import Tkinter as tk
OUTPUT = "RESULT STATUS: OK- Service is currently runningnnDETAILS: ... "
root = tk.Tk()
text = tk.Text(root, height=4, width=80)
text.pack(fill="both", expand="true")
text.insert("end", OUTPUT)
root.mainloop()

我解决了这个问题,这要归功于。。这是一个/r字符的问题。。我想,当我调用子流程时。弹出以运行我的命令行脚本,打开Windows命令提示符,执行脚本,Prompt返回的标准输出流以/r/n行结尾,而不是仅以/n行结尾。

无论如何,我会一直发布代码和GUI工作流程。。。

工作流

这是我的GUI的工作流程:

  1. 我点击一个按钮,它调用callMe()回调函数
  2. callMe()函数解析来自Entry小部件的参数,然后调用python命令行脚本
  3. 脚本返回上面提到的字符串,回调使用它来更新text小部件的文本

代码

这是代码:

#init the GUI elements and the Text widget
from Tkinter import *
root = Tk()     
top = Frame(root)
outputFrame = Frame(top)
outputFrame.pack(side='top', padx=20, pady=20)
outputTextArea = Text(outputFrame, yscrollcommand=scrollbar.set, width=150, height=40)
outputTextArea.pack(side='left', expand=YES, fill='both')
#callback executed when the button is clicked
def callMe():
    #get parameters
    # .....
    #command line execution script execution
    process = subprocess.Popen(command_line, stdout=subprocess.PIPE, shell=True)
    #get script output
    matr = process.stdout.readlines()  
    #from a list of strings to a single string
    output = "".join(matr)  # <<< now it is:  output = "".join(matr).replace('r', '')
    #write output into the Text widget
    outputTextArea.insert(0.0, output)



非常感谢你们所有人,伙计们!

相关内容

  • 没有找到相关文章

最新更新