Почему все отображается в главном окне, а не в определенных кадрах? - PullRequest
0 голосов
/ 10 апреля 2020

Итак, я начал создавать GUI, который я буду использовать для испытательного стенда для электрических двигателей. Мой вопрос: почему все отображается в главном окне так:

everything displayed

Вместо двух кадров?

В первый раз, когда я написал его, он работал отлично:

[first time[2]

, но затем я захотел изменить код, используя классы, и появилась проблема. Я использую Python 3,7.

Мой код:

import tkinter as tk
from tkinter import *
from tkinter import messagebox

class Lintebench():
    def __init__(self, master):
        self.master = master
        self.master.title("Linte^2 testbench")
        self.master.geometry('1000x600')

    #FRAMES
        frame = Frame(master, bg='#3e646c').place(relwidth=0.2, relheight=0.4, rely=0.6)
        frame2 = Frame(master, bg='#3e646c').place(relwidth=0.8, relheight=0.4, rely=0.6, relx=0.2)

    #FRAME 1
        self.start_button = Button(frame, text="Start", padx=50, pady=50, bg='green', activebackground='grey', command=self.start_engine).pack()
        self.stop_button = Button(frame2, text="Stop", padx=50, pady=50, bg='red', activebackground='grey', command=self.stop_engine).pack()

    #FRAME 2
        self.parameters = Label(frame2, text="PARAMETERS", font=("Arial", 16), fg='white', bg='#3e646c').place(relx=0)
        self.set_parameter = Label(frame2, text="SET", font=("Arial", 16), fg='white', bg='#3e646c').place(relx=0.8)
        self.values = Label(frame2, text="VALUES", font=("Arial", 16), fg='white', bg='#3e646c').place(relx=0.4)
        self.torque = Label(frame2, text="TORQUE", font=("Arial", 12), fg='white', bg='#3e646c').place(relx=0.7, rely=0.2)
        self.velocity = Label(frame2, text="VELOCITY", font=("Arial", 12), fg='white', bg='#3e646c').place(relx=0.7, rely=0.6)

    #parameters to set
        self.set_torque = Scale(frame2, orient=HORIZONTAL, length=200).place(relx=0.7, rely=0.3)
        self.set_velocity = Scale(frame2, orient=HORIZONTAL, length=200).place(relx=0.7, rely=0.7)

    def start_engine(*args):
        messagebox.showinfo('Information','Engine was started')

    def stop_engine(*args):
        messagebox.showinfo('Information','Engine was stopped')

def main():
    root = Tk()
    lintebench = Lintebench(root)
    root.mainloop()

if __name__ == '__main__':
    main()here

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Это потому, что вы связали Frame(...) с place(...), и поэтому frame и frame2 будут None. Разделите цепочечный оператор на два:

frame = Frame(master, bg='#3e646c')
frame.place(relwidth=0.2, relheight=0.4, rely=0.6)
frame2 = Frame(master, bg='#3e646c')
frame2.place(relwidth=0.8, relheight=0.4, rely=0.6, relx=0.2)

На самом деле вам нужно разделить все цепочечные операторы в вашем коде, если вы хотите ссылаться на виджеты в другом месте.

Также self.stop_button должен быть ребенком frame, а не frame2:

self.stop_button = Button(frame, text="Stop", padx=50, pady=50, bg='red', activebackground='grey', command=self.stop_engine)
self.stop_button.pack()
0 голосов
/ 10 апреля 2020

Я полагаю, потому что вы назначаете их мастера как root, и у вас есть только один root, и когда вы делаете roo.mainloop(), это заставляет их фокусироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...