2017-04-06 51 views
0

所以下面的代码是我的实际代码的缩写版本。我在获取一个小部件出现在一个放置在一个Frame中的Frame中时遇到问题。将小部件放入框架内的框架时出错。 Tkinter - Python3

因此,基本上下面的代码是一个登录菜单,其中当单击一个按钮时,该框架将更改为另一个框架。在这种情况下,login_frameoverview_frame。在overview_frame内我有另一个框架titleFrame,这个框架放在overview_frame上。

现在问题发生在我想将小部件放入titleFrame这个实例中titleLabel.grid()放置方法。

我已经完成了这个与我创建的其他tkinter应用程序,我一直试图把这个好几个小时现在,而不是得出结论。这是我不断收到错误:


Traceback (most recent call last): 
    File "C:\Users\nasto\Documents\Company\rfr.py", line 67, in <module> 
    app = frame_store() 
    File "C:\Users\nasto\Documents\Company\rfr.py", line 16, in __init__ 
    frame = n_frame(parent=container, controller=self) 
    File "C:\Users\nasto\Documents\Company\rfr.py", line 57, in __init__ 
    titleLabel = tk.Label(titleFrame, text='TITLE').grid(row=0,column=0, sticky='nsew', padx=2, pady=2) 
    File "C:\Users\nasto\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 2220, in grid_configure 
    + self._options(cnf, kw)) 
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack 

现在这个代码,我所做的其他应用程序之间的唯一区别是frame_store类。其中有一行代码使用.Pack()但是,当删除此代码时,login_frametitleFrame不显示,并且小部件将直接转到overview_frame。我将如何摆脱.Pack(),同时确保所有框架仍应可见,或将titleLabel放在titleFrame上,同时使用.grid() 我个人认为它可能与titleFrame连接的内容有关,例如// self但一边搞乱了我一直没有得到有效的结果。

import tkinter as tk 
import hashlib 
import sqlite3 

class frame_store(tk.Tk): 
    def __init__(self, *args, **kwargs): 
    tk.Tk.__init__(self, *args, **kwargs) 
    '''container is used so that all the frames can be stacked, from there we can call other frames within the container to the top, to the current active frame''' 
    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 = {} 
    for n_frame in (login_frame, overview_frame, accounting_frame): 
     pageName = n_frame.__name__ 
     frame = n_frame(parent=container, controller=self) 
     self.frames[pageName] = frame 
     frame.grid(row=0, column=0, sticky='nsew') 
    self.show_frames('login_frame') 

    def show_frames(self, pageName): 
    frame = self.frames[pageName] 
    self.update_idletasks() 
    self.state('zoomed') 
    self.title('A2 Project') 
    frame.tkraise() 

class login_frame (tk.Frame): 
    def __init__(self, parent, controller): 
    tk.Frame.__init__(self, parent) 
    self.controller = controller 
    loginButton = tk.Button(self, text='Login', command = self.no_credentials).grid(row=3,column=0) 
    self.controller.bind('<Control-n>', lambda event: self.no_credentials()) 

    def no_credentials(self): 
    self.controller.show_frames('overview_frame') 

    def clear(self): 
    self.__userID.set('') 
    self.__password.set('') 

    def exit(self): 
    app.destroy() 


class overview_frame(tk.Frame): 
    def __init__(self, parent, controller): 
    tk.Frame.__init__(self, parent) 
    self.controller = controller 

    self.config(background='#000000') 
    self.rowconfigure(0, weight=1) 
    self.columnconfigure(0, weight=1) 

    titleFrame = tk.Frame(self, background='#f8f8ff', bd=1, relief='sunken').grid(row=0, column=0, sticky='nsew', padx=2, pady=2) 

    titleLabel = tk.Label(titleFrame, text='TITLE').grid(row=0,column=0, sticky='nsew', padx=2, pady=2) 


class accounting_frame(tk.Frame): 
    def __init__(self, parent, controller): 
    tk.Frame.__init__(self, parent) 
    self.controller = controller 
    pass 

if __name__ == "__main__": 
    app = frame_store() 
    app.mainloop() 

回答

1

你的问题是由于创建你的框架和对准它的一行代码。

写入时:

titleFrame = tk.Frame(self, relief='sunken').grid(row=0, column=0) 

titleFrame.grid()方法的输出,而不是tk.Frame刚刚创建。所以它不能作为未来小部件的父项。

为了参考保持到窗口小部件,你必须widget创建从部件排列分开:

titleFrame = tk.Frame(self, background='#f8f8ff', bd=1, relief='sunken') 
titleFrame.grid(row=0, column=0, sticky='nsew', padx=2, pady=2) 
titleLabel = tk.Label(titleFrame, text='TITLE') 
titleLabel.grid(row=0,column=0, sticky='nsew', padx=2, pady=2)