Есть ли в Python 2.7 окно сообщения, которое отображает копируемый текст?

Я пытаюсь написать программу Python, которая получает строку в качестве ввода и отображает строку в окне сообщения с удалением последней буквы из каждого слова. Я успешно написал код для удаления последней буквы из каждого слова и узнал о модуле tkinter. Но текст не может быть скопирован из окна сообщения tk. Есть ли другой способ отобразить окно сообщения с копируемым текстом? Если нет способа отобразить такие окна сообщений, есть ли способ отобразить вывод в форме с возможностью копирования без отображения окна сообщения? Дополнительная (бесполезная) информация:

  1. Имя этого языка fromonk (если вам интересно, почему имя var fromonk_text)
  2. Смайлы должны отображаться целиком (включая последнюю букву). Отсюда блок if-else.

Код, который я написал:

import tkMessageBox
line="foo"
while line!="exit":
    fromonk_text=""
    line=raw_input()
    words=line.split()
    for word in words:
        if word.startswith(":"):
            fromonk_text+=word+" "
        else:
            fromonk_text+=word[0:len(word)-1]+" "
    tkMessageBox.showinfo("Fromonk",fromonk_text)

person Subramanian Sridharan    schedule 10.03.2016    source источник


Ответы (1)


Нет ничего встроенного. Вы можете создать свой собственный всплывающий диалог с Toplevel виджетом, который содержит Text виджет и несколько Button виджетов, или вы можете использовать tkSimpleDialog

Некоторую документацию можно найти здесь: http://effbot.org/tkinterbook/tkinter-dialog-windows.htm

Вот простой рабочий пример. Он позволяет редактировать текст, но вы можете отключить это, если хотите.

import Tkinter as tk
import tkSimpleDialog

class CustomDialog(tkSimpleDialog.Dialog):

    def __init__(self, parent, title=None, text=None):
        self.data = text
        tkSimpleDialog.Dialog.__init__(self, parent, title=title)

    def body(self, parent):

        self.text = tk.Text(self, width=40, height=4)
        self.text.pack(fill="both", expand=True)

        self.text.insert("1.0", self.data)

        return self.text

def show_dialog():
    fromonk_text = "this is an example"
    CustomDialog(root, title="Example", text=fromonk_text)

root = tk.Tk()
button = tk.Button(root, text="Click me", command=show_dialog)
button.pack(padx=20, pady=20)
root.mainloop()

Пример окна

person Bryan Oakley    schedule 11.03.2016
comment
Для пользователей Python 3 переименуйте следующие импорты: Tkintertkinter, tkSimpleDialogtkinter.simpledialog - person Stevoisiak; 02.03.2018
comment
Этот ответ служит хорошим примером того, как наследовать / переопределять класс tkSimpleDialog, если это правильный способ его формулировки. Мне интересно, потому что этот класс имеет self.wait_window(self), который, надеюсь, позволяет tkinter работать в фоновом режиме, пока пользователь не нажмет кнопку. - person WinEunuuchs2Unix; 01.11.2020
comment
@ WinEunuuchs2Unix: tkinter не работает в фоновом режиме. Tkinter однопоточный. wait_window позволяет mainloop продолжить обработку событий, но функция не вернется, пока диалог не будет уничтожен. - person Bryan Oakley; 01.11.2020
comment
@BryanOakley Я не уверен, что mainloop должен делать, но могу сказать, что все tkinter окна замерзают, когда wait_window выполняется в tkSimpleDialog, поэтому мне придется создать специальный фоновый процесс диалогового окна, как и все другие окна, которые мне приходилось создавать так что все tkinter окна работают одновременно. Я сделаю это позже, потому что мне нужно написать гораздо больше кода. Спасибо за ваше доброе терпение, которое так часто мне объясняет. - person WinEunuuchs2Unix; 03.11.2020
comment
@ WinEunuuchs2Unix: Я никогда не видел, чтобы все окна зависали при вызове wait_window. Фактически, в некотором смысле эта функция была создана специально для того, чтобы окна не зависали. Все mainloop он постоянно обрабатывает события из очереди событий. Это едва ли больше, чем while цикл, а wait_window - чуть больше, чем mainloop с дополнительной проверкой, чтобы увидеть, существует ли окно перед возвратом. - person Bryan Oakley; 03.11.2020