Ярлыки Tkinter не отображаются во всплывающем окне

1

Я недавно начал программировать на python, и Stack Overflow, казалось, был источником, где все ошибки, с которыми я мог столкнуться, уже были заданы кем-то другим и ответили. На этот раз я столкнулся с ошибкой и не нашел ответа.

Я написал приложение, используя графический интерфейс с tkinter. В одной части этого приложения пользователь нажимает кнопку на мэйнфрейме, чтобы открыть другое окно и ввести данные. После этого пользователь закрывает всплывающее окно и данные обрабатываются программой. В этом всплывающем окне ярлыки рядом с виджетами Entry не отображаются.

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

Таким образом, кажется, что что-то в моем главном окне препятствует появлению ярлыков во всплывающем окне? Или я забыл сказать программе сделать что-то, чтобы активно показывать ярлыки?

import tkinter as tk, sys
from tkinter import StringVar, Tk
from tkinter.filedialog import askopenfilename

root = tk.Tk()
root.title("title")
w = tk.Label(root, text="text")
w.pack()

# This is the code snippet that works isolated, but not in this context
def enter_deadline():
    det_window = tk.Tk()
    # Enter deadline
    shime_text =  StringVar()
    shime_text.set("〆切月日記入:")
    label_shime=tk.Label(det_window, textvariable=shime_text, height=6)
    label_shime.pack(side="left", padx = 20, pady=20)
    shime_val = StringVar(None)
    det_shime = tk.Entry(det_window,textvariable=shime_val, width=20)
    det_shime.pack(side="left", padx = 20, pady=20)

    def killme():
            det_window.destroy()
    det_button = tk.Button(det_window, text='スタート',command=killme).pack()
    det_window.mainloop()


# Make pop-up window for PO
def create_POW():
    try:
        Tk().withdraw()
        # show an "Open" dialog box and return the path
        po_filename = askopenfilename()
        po_file = open(po_filename, 'rb')
        enter_deadline()
    except Exception as e:
        print("ファイルエラー")
        print(e)
        sys.exit()

    # lots of repititive code for buttons
button3 = tk.Button(root, text='PO',command=create_POW).pack()

root.mainloop()

Поскольку изолированный фрагмент кода делает то, что должен, кажется, что-то еще мне не хватает.

Заранее спасибо. Andreas

  • 0
    какой бэкэнд вы используете?
  • 0
    Обычно я использую Thonny (который использует Python 3.7). Я попытался запустить скрипт в IDLE (также Python 3.7) с тем же результатом. Я использую Windows 10, 64 бит.
Теги:
tkinter

1 ответ

1
Лучший ответ

Основная проблема заключается в том, что вы создали несколько экземпляров Tk() (вы создаете новый, когда нажимаете кнопку button3). Поэтому измените det_window на экземпляр Toplevel и удалите вызов det_window.mainloop() внутри функции enter_deadline(). Также удалите оператор Tk().withdraw() create_POW() внутри функции create_POW().

Ниже приведен модифицированный код с вышеуказанными изменениями:

import tkinter as tk, sys
from tkinter import StringVar, Tk
from tkinter.filedialog import askopenfilename

root = tk.Tk()
root.title("title")
w = tk.Label(root, text="text")
w.pack()

# This is the code snippet that works isolated, but not in this context
def enter_deadline():
    det_window = tk.Toplevel()  # changed from tk.Tk()
    # Enter deadline
    shime_text =  StringVar()
    shime_text.set("〆切月日記入:")
    label_shime=tk.Label(det_window, textvariable=shime_text, height=6)
    label_shime.pack(side="left", padx = 20, pady=20)
    shime_val = StringVar(None)
    det_shime = tk.Entry(det_window,textvariable=shime_val, width=20)
    det_shime.pack(side="left", padx = 20, pady=20)

    def killme():
            det_window.destroy()
    tk.Button(det_window, text='スタート',command=killme).pack()
    #det_window.mainloop()


# Make pop-up window for PO
def create_POW():
    try:
        #Tk().withdraw()
        # show an "Open" dialog box and return the path
        po_filename = askopenfilename()
        po_file = open(po_filename, 'rb')
        enter_deadline()
    except Exception as e:
        print("ファイルエラー")
        print(e)
        sys.exit()

    # lots of repititive code for buttons
button3 = tk.Button(root, text='PO',command=create_POW).pack()

root.mainloop()
  • 0
    Отлично. Это очень помогло. Все работает, как задумано сейчас. Большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню