Создание всплывающего окна с полем ввода

Я хочу создать всплывающее окно сообщения, которое предлагает пользователю ввести ввод. У меня есть этот метод внутри класса. Я основываю свой код на этом руководстве от java2s.

class MyDialog:
    def __init__(self, parent):
        top = self.top = Toplevel(parent)

        Label(top, text="Value").pack()

        self.e = Entry(top)
        self.e.pack(padx=5)

        b = Button(top, text="OK", command=self.ok)
        b.pack(pady=5)

    def ok(self):
        print "value is", self.e.get()
        self.top.destroy()

root = Tk()
d = MyDialog(root)

root.wait_window(d.top)

Но в этом top = self.top = Toplevel(parent) не работает для меня

У меня есть макет того, что я пытаюсь сделать.

GUI макет

Моя структура программы выглядит примерно так:

class MainUI:
   def__int__(self):
       ...
       self.initUI()

   def initUI(self):
       .......
       Popup = Button(self, text="Enter Value", command=self.showPopup)

   def showPopup(self):
       #create the popup with an Entry here

Как я могу создать окно сообщения в Python, которое принимает пользовательский ввод?

4 ответа

Решение

Я немного запутался в ваших двух разных блоках кода. Просто обращаясь к первому блоку кода, ничего не происходит, потому что вы никогда не входите в mainloop. Для этого нужно позвонить root.mainloop(), Типичный способ сделать это - добавить кнопку в корневой виджет и привязать функцию обратного вызова к кнопке (которая включает d=MyDialog() а также root.wait_window(d.top))

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

from Tkinter import *
import sys

class popupWindow(object):
    def __init__(self,master):
        top=self.top=Toplevel(master)
        self.l=Label(top,text="Hello World")
        self.l.pack()
        self.e=Entry(top)
        self.e.pack()
        self.b=Button(top,text='Ok',command=self.cleanup)
        self.b.pack()
    def cleanup(self):
        self.value=self.e.get()
        self.top.destroy()

class mainWindow(object):
    def __init__(self,master):
        self.master=master
        self.b=Button(master,text="click me!",command=self.popup)
        self.b.pack()
        self.b2=Button(master,text="print value",command=lambda: sys.stdout.write(self.entryValue()+'\n'))
        self.b2.pack()

    def popup(self):
        self.w=popupWindow(self.master)
        self.b["state"] = "disabled" 
        self.master.wait_window(self.w.top)
        self.b["state"] = "normal"

    def entryValue(self):
        return self.w.value


if __name__ == "__main__":
    root=Tk()
    m=mainWindow(root)
    root.mainloop()

Я получаю значение из popupWindow и использую его в основной программе (взгляните на лямбда-функцию, связанную с b2).

Главное окно:

Главное окно

Окно "Нажми меня":

кликни мне окно

Главное окно, пока "нажмите меня" открыто:

Главное окно с серым цветом

import tkinter as tk
from tkinter import simpledialog

ROOT = tk.Tk()

ROOT.withdraw()
# the input dialog
USER_INP = simpledialog.askstring(title="Test",
                                  prompt="What's your Name?:")

# check it out
print("Hello", USER_INP)

Наслаждаться...

Я сделал это в Tkinter без каких-либо классов. Я создал функцию, которая запускает новое окно.

popup.Tk()popup.mainloop()

В этом окне есть поле ввода, откуда я получаю текст с переменной, значение которой: entry.get()

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

Я только что попробовал:

def get_me():s = simpledialog.askstring("строка ввода", "введите добавленный текст")

Источник: https://www.youtube.com/watch?v=43vzP1FyAF8

Другие вопросы по тегам