Этикетка Tkinter не будет отображаться внутри рамки этикетки

#python #tkinter

Вопрос:

Я создал графический интерфейс для приема 2 файлов JSON и их сравнения. Как показано в приведенном ниже коде, мой фрейм метки(policyframe) находится внутри второго фрейма, используемого для создания полосы прокрутки.

При запуске кода я успешно вижу метку, содержащую «Имя 1» и «Имя 2» из файла 1 и 2 соответственно. однако после создания метки для отображения описания второго файла появится новое окно с пустым экраном.

В разных пробах и ошибках это были мои наблюдения :

  • Я попытался отобразить другие ключи файла 1 и также смог их увидеть.
  • Попробовал отобразить «Ключ имени» обоих файлов JSON и добился успеха.
  • Не удается увидеть никакого другого ключа файла 2, кроме «name_c»

Также добавили данные json, например.

 from typing import Counter
from file import Root
from io import SEEK_CUR
from tkinter import *
from tkinter import ttk
from tkinter import filedialog

import json

class Main:
    def __init__(gui, master):
        label1 = Label(second_frame, text = "Test GUI")
        label1.pack()
        button_a = Button(second_frame, text="Choose Json File1", command=gui.file_a)
        button_a.pack()
        button_c = Button(second_frame, text="Choose Json File2", command=gui.file_c)
        button_c.pack()

        button_compare = Button(second_frame, text="Compare Json", command=gui.compare).pack()

    def file_a(gui) :
        gui.filename1 = filedialog.askopenfilename(initialdir = "/", title = "Select a file", filetype = (("json", "*.json"), ("All Files", "*.*")))
        
    def file_c(gui) :
        gui.filename2 = filedialog.askopenfilename(initialdir = "/", title = "Select a file", filetype = (("json", "*.json"), ("All Files", "*.*")))
    
    def compare(gui) :
        Label(second_frame, text = "Starting to Compare").pack()

        with open(gui.filename1) as af:
            data_a = json.load(af)

        with open(gui.filename2) as cf:
            data_c = json.load(cf)
        
        count = 0

        for f1 in data_a['policies'] :
            name_a = f1['displayName']
           
            for f2 in data_c['rules'] :
                name_c = f2['properties']['displayName']
                description_c = f2['properties']['description']

                if name_a == name_c:
                    
                    policy_frame = LabelFrame(second_frame, text='Comparing Json Files', padx=5, pady=5)
                    policy_frame.pack()

                    Label(policy_frame, text=f'Name 1 : {name_a}').pack()
                    
                    Label(policy_frame, text=f'Name 2 : {name_c}').pack()
                    #Label(policy_frame, text=f'Description 2 : {description_c}').pack()
               
                else :
                    count = count   1
                    
        print(count)                

root = Tk()

root.title("Test GUI")
root.geometry("500x400")

main_frame = Frame(root)
main_frame.pack(fill=BOTH, expand=1)

my_canvas = Canvas(main_frame)
my_canvas.pack (side = LEFT, fill = BOTH, expand=1)

my_scrollbar = ttk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT, fill=Y)

my_canvas.configure(yscrollcommand = my_scrollbar.set)
my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion = my_canvas.bbox("all")))

second_frame = Frame(my_canvas)

my_canvas.create_window((0,0), window=second_frame, anchor="nw")

main = Main(root)

root.mainloop()
 

Файл Json 1

 {
  "policies": [
    {
      "displayName": "Name 1",
      "status": {
        "cause": abc,
        "code": "python",
        "description": Test 1
      },
    }
  ]
}
 

Файл Json 1

 {
  "rules": [
    {
      "displayName": "File 2 Name 1",
      "description": "Description of Key 1"
    }
  ]
}
 

Ответ №1:

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

Просто упаковав этикетку, чтобы закрепить ее на западе, данные были видны.

labelname.pack(padx=5, pady=5, anchor = "w"

Это решает проблему.