#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"
Это решает проблему.