在python3中使用tkinter的子帧

在python3中使用tkinter的子帧,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我试图将我的帧划分为更多的子帧,并为一个子帧调用一个按钮,但在下面的代码中,我的子帧似乎远离我的帧。如果有人能帮助我,我将不胜感激 #!/usr/bin/python import time import RPi.GPIO as GPIO from tkinter import * import tkinter as tkenter GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(5, GPIO.OUT) #Luminá

我试图将我的帧划分为更多的子帧,并为一个子帧调用一个按钮,但在下面的代码中,我的子帧似乎远离我的帧。如果有人能帮助我,我将不胜感激

#!/usr/bin/python

import time
import RPi.GPIO as GPIO
from tkinter import *
import tkinter as tkenter 

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

GPIO.setup(5, GPIO.OUT) #Luminária A
GPIO.setup(6, GPIO.OUT) #Luminária B
GPIO.setup(13, GPIO.IN) #Luz ambiente no setor
GPIO.setup(19, GPIO.IN) #Pessoas no setor

GPIO.output(5, GPIO.LOW)
GPIO.output(6, GPIO.LOW)

LARGE_FONT = ("Verdana", 12)


def leD():

    if ((GPIO.input(5)) and (GPIO.input(6))):
        GPIO.output(5, GPIO.LOW)
        GPIO.output(6, GPIO.LOW)
        app.frames[Acionamento].vendasFrame.vendasAcionamento["text"]="Lights on"

    else:
        GPIO.output(5, GPIO.HIGH)
        GPIO.output(6, GPIO.HIGH)
        app.frames[Acionamento].vendasFrame.vendasAcionamento["text"]="Lights off"

def sairr():
    GPIO.cleanup()
    exit()


class showAcionam(tk.Tk):


    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)

        container.pack(side="top", fill="both", expand = True)

        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        frame = Acionamento(container, self)

        self.frames[Acionamento] = frame

        frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(Acionamento)


    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class Acionamento(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Acionamento", font=LARGE_FONT)
        label.pack(padx=5,padx=5)

        #Subframe 1
        vendasFrame = tk.Frame(self)
        vendasFrame.pack(side=left, anchor="center")
        vendasAcionamento = tk.Button(vendasFrame, text="Luminárias desligadas", command = leD)
        vendasAcionamento.pack(side="top")
        self.vendasAcionamento = vendasAcionamento


        #Subframe 2
        engenhariaFrame = tk,Frame(self)
        engenhariaFrame.pack(side="left", anchor="center")


app = showAcionam()
app.mainloop()
错误:

    Exception in Tkinter callback
    Traceback (most recent call last):
       File "/home/pi/TCC.py", line 65, in leD
         app.frames[Acionamento].vendasFrame.vendasAcionamento["text"] = "100% de iluminação"
    AttributeError: 'Acionamento' object has no atribute 'vendasFrame'

你的问题和上一个问题一样

您必须使用
self.

self.vendasFrame = tk.Frame(self)

vendasFrame
是局部变量,仅存在于方法
self.vendasFrame
是对象变量,您可以在此方法之外访问此变量。

好的,我找到并解决了它!您建议如何将帧划分为子帧?我试着用pack做这个,但是主框架标题离子框架太远了。你能给我举个例子吗?你使用
padx
在标题和框架之间创建边距。我记得,您可以使用tuple只设置左边距
padx=(5,0)
。顺便说一句。如果在子帧中只保留一个小部件(按钮),那么创建subframe.BTW是没有意义的。您可以在
标签中对齐
文本。请参见图片: