Python tkinter Entry виджет отображает символы строки вместо разрывов строк - PullRequest
2 голосов
/ 06 июня 2011



Я пишу очень простой графический интерфейс Python Tkinter для запуска сценария Python из командной строки.
Мой графический интерфейс будет работать на хосте Windows, и я хочу, чтобы он отображал многострочный текст-текстовый вывод сценария, который возвращается в графический интерфейс в виде строки, содержащей - конечно же - разрывы строк (\n символов).

Итак, я помещаю текстовый виджет в графический интерфейс и когда мой сценарий- в примере - возвращает вывод, который начинается с этой подстроки:

RESULT STATUS: OK- Service is currently running\n\nDETAILS: ...

отображаемый текст содержит черные вертикальные полосы (|) всякий раз, когда есть \n символ переноса строки,

Линии правильно разорваны, но эти странные полосы заставляют меня думать, что символ разрыва строки \n неправильно декодирован, и я не хочу, чтобы полосы отображались в моем выводе.

Есть идеи, как заставить Tkinter правильно отображать окончания строк?Заранее спасибо.

Код

Это рабочий процесс для моего графического интерфейса:

  1. Я нажимаю кнопку, которая вызывает функцию обратного вызова callMe ()
  2. Функция callMe () анализирует аргументы, поступающие из виджета Entry, а затем вызывает скрипт командной строки python
  3. Скрипт возвращает вышеупомянутую строку, и он используется обратным вызовом для обновления текставиджета Текст

Вот код:

#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)

Ответы [ 4 ]

3 голосов
/ 06 июня 2011

Это может быть проблема с символами '\ r' перед каждым символом '\ n' (вы сказали, что находитесь в Windows).

Перед обновлением виджета попробуйте сначала:

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

(text_output содержит вывод вашего скрипта, содержимое которого должно быть вставлено в виджет)

Если вы дадите нам больше информации, мы поможем вам больше.

0 голосов
/ 06 июня 2011

Я решил вопрос благодаря ΤΖΩΤΖΙΟΥ..Это было вопросом /r символов .. Я думаю, что когда я вызываю подпроцесс. Откройте для запуска мой сценарий командной строки, откроется командная строка Windows, сценарийвыполняется, и стандартный поток вывода возвращается в подсказке с /r/n окончаниями строк вместо /n.

Во всяком случае, я буду публиковать код и рабочий процесс GUI полностью ...

Рабочий процесс

Эторабочий процесс для моего графического интерфейса:

  1. Я нажимаю кнопку, которая вызывает функцию обратного вызова callMe ()
  2. Функция callMe () анализирует аргументы, поступающие из виджета Entry, а затем вызываетСкрипт командной строки python
  3. Скрипт возвращает вышеупомянутую строку и используется обратным вызовом для обновления текста виджета Текст

Код

Вот код:

#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)



Большое спасибо всем вам, ребята!

0 голосов
/ 06 июня 2011

Не видя ваш код, невозможно точно сказать, в чем проблема. Вы говорите, что используете текстовый виджет, но поведение кажется совместимым с использованием виджета ввода. Вы все еще видите вертикальные полосы со следующим кодом?

import Tkinter as tk

OUTPUT = "RESULT STATUS: OK- Service is currently running\n\nDETAILS: ... "

root = tk.Tk()
text = tk.Text(root, height=4, width=80)
text.pack(fill="both", expand="true")
text.insert("end", OUTPUT)

root.mainloop()
0 голосов
/ 06 июня 2011

Когда использовать виджет ввода (из http://effbot.org/tkinterbook/entry.htm)

Виджет ввода используется для ввода текстовых строк. Этот виджет позволяет пользователю вводить одну строку текста одним шрифтом.

Чтобы ввести несколько строк текста, используйте виджет «Текст».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...