Problems inserting two different classes within the same frame into a notebook using Tkinter and Python

蓝咒 提交于 2019-12-24 16:58:17

问题


I have been trying inserting two different classes (in the code below "MyListbox" and "Calculation") within the same frame into a notebook using Tkinter and Python. Actually I Have not received any report from my computer saying where I am wrong. My computer doesn't show anything, not even a message. Can you help me solving this problem?

Thanks in advance.

Here is the code:

import Tkinter
from Tkinter import *
from Tkinter import Tk, Text, BOTH, W, N, E, S
from ttk import Frame, Button, Label, Style
import Tkinter as tk
import ttk 
import tkFont
from ttk import *
import tkMessageBox
import sys
import math
import Tkconstants 


def defocus(event):
    event.widget.master.focus_set()

root = tk.Tk()
root.title("Autana")

f= tkFont.Font(family="verdana", size=12,weight=tkFont.BOLD)#, weight=tkFont.BOLD)
f2= tkFont.Font(family="Times", size=20, weight=tkFont.BOLD)

c1= 'PeachPuff2'

notebook = ttk.Notebook(root)
notebook.pack(fill=BOTH, expand=True)
notebook.pressed_index = None

ContainerOne = Tkinter.Frame(notebook);
ContainerOne.pack(fill=BOTH, expand=True);

notebook.add(ContainerOne, text='Standard Reliability')

canvas1 = Canvas(ContainerOne, width=950, height=450,bg=c1)
scroll = Scrollbar(ContainerOne, command=canvas1.yview)
canvas1.config(yscrollcommand=scroll.set, scrollregion=(0,0,100,1000))
canvas1.pack(side=LEFT, fill=BOTH, expand=True)
scroll.pack(side=RIGHT, fill=Y)

frameOne = Tkinter.Frame(canvas1, width=900, height=450,bg=c1,bd=22)
canvas1.create_window(630, 270, window=frameOne)

class MyListbox:
    def __init__(self, parent):#, title):
        self.parent = parent
        self.myData= (
                    ["1", "Jhon Doe", "Madrid", "0341-672541", "6 SD"],
                    ["5", "Kenji S.", "Tokyo", "0341-213212", "10 SD"])
        self.establishment()

    def combobox_handler(self, event):
        current = self.combobox.current()
        self.entNumber.delete(0, END)
        self.entName.delete(0, END)
        self.entCity.delete(0, END)
        self.entTel.delete(0, END)
        self.entAddress.delete(0, END)

        self.entNumber.insert(END, self.myData[current][0])
        self.entName.insert(END, self.myData[current][1])
        self.entCity.insert(END, self.myData[current][2])
        self.entTel.insert(END, self.myData[current][3])
        self.entAddress.insert(END, self.myData[current][4])

    def establishment(self):
        mainFrame = Frame(self.parent)
        mainFrame.pack(fill=BOTH, expand=YES)

        fr_left = Frame(mainFrame)#, bd=10)
        fr_left.pack(fill=BOTH, expand=YES, side=LEFT)

        names = [person[1] for person in self.myData]
        self.combobox = ttk.Combobox(fr_left, values=names)
        self.combobox.bind('<<ComboboxSelected>>', self.combobox_handler)
        self.combobox.pack()
        self.combobox.set("Data People")

        fr_right = Frame(mainFrame)#, bd=10)
        fr_right.pack(fill=BOTH, expand=YES, side=RIGHT)

        fr_up = Frame(fr_right)
        fr_up.pack(side=TOP, expand=YES)

        Label(fr_up, text='List Number').grid(row=0, column=0, sticky=W)
        self.entNumber = Entry(fr_up)
        self.entNumber.grid(row=0, column=1)

        Label(fr_up, text='Name').grid(row=1, column=0, sticky=W)
        self.entName = Entry(fr_up)
        self.entName.grid(row=1, column=1)

        Label(fr_up, text='City').grid(row=2, column=0, sticky=W)
        self.entCity = Entry(fr_up)
        self.entCity.grid(row=2, column=1)

        Label(fr_up, text='No. Tel').grid(row=3, column=0, sticky=W)
        self.entTel = Entry(fr_up)
        self.entTel.grid(row=3, column=1)

        Label(fr_up, text='Address').grid(row=4, column=0, sticky=W)
        self.entAddress = Entry(fr_up)
        self.entAddress.grid(row=4, column=1)


class Calculation:

    def __init__(self, parent):
        self.parent = parent
        self.Value1()
        self.Value2()
        self.Result()

        Label(self.parent,text='Num 1').grid(column=2, row=5, sticky=W, pady=3)
        Label(self.parent,text='Num 2').grid(column=2, row=6, sticky=W, pady=3)
        Label(self.parent,text='result').grid(column=9,row=9, sticky=W, pady=3)

        self.msg = Label(self.parent,text='Sum of 2 number')
        self.msg.grid(row=3,column=1,columnspan=2)

        self.Button = Button(text='Calculate',width=8,command=self.Calc)
        self.Button.grid(row=9,column=2,padx=2,pady=3)

    def Value1(self):
        self.field1 = ttk.Combobox(self.parent)
        self.field1['values'] = ('5', '6', '7')
        self.field1.grid(column=3, row=5)

    def Value2(self):
        self.field2 = ttk.Combobox(self.parent)
        self.field2['values'] = ('1', '2', '3')
        self.field2.grid(column=3, row=6)

    def Result(self):
        self.entry = StringVar()
        self.entry = ttk.Entry(self.parent, textvariable=self.entry)
        self.entry.grid(column=3, row=9)

    def Calc(self):
        self.entry.delete(0, END)
        try:
            value = int(self.field1.get()) + int(self.field2.get())
        except ValueError:
            self.entry.insert(0, 'Input numbers.')
        else:
            self.entry.insert(0, str(value))

if __name__ == '__main__':

    stepOne = Tkinter.LabelFrame(frameOne, text=" 1. Select People: ",font= f2, bd=6)
    stepOne.grid(row=0, columnspan=5, sticky='nsew', \
                 padx=5, pady=5, ipadx=5, ipady=5)

    stepTwo = Tkinter.LabelFrame(frameOne, text=" 2. Calculation : ",font= f2, bd=6)
    stepTwo.grid(row=2, columnspan=7, sticky='w', \
             padx=5, pady=5, ipadx=5, ipady=5)

    app = MyListbox(stepOne)
    app2 = Calculation (stepOne)----> This is not working!
    root.mainloop()

回答1:


You are using app2 = Calculation (stepOne), and that means that you are placing different widgets with the same parent in the same grid positions. The outcome in this situation is that Tkinter does not display any widget at all.

But even if changing it with app2 = Calculation (stepTwo), you still have the same problem with this two lines of code:

self.Button = Button(text='Calculate',width=8,command=self.Calc)
self.Button.grid(row=9,column=2,padx=2,pady=3)

You are not setting any parent, so it uses the default Tk element and the same problem that I mentioned before occurs, but this time with the root element.

Finally, I strongly recommend you to use only one import statement for each module, since Tkinter and ttk uses the same names for some classes and it is different if you used a themed widget or not.

import Tkinter as tk
import ttk 
import tkFont
import tkMessageBox
import sys
import math

# ...


来源:https://stackoverflow.com/questions/17050473/problems-inserting-two-different-classes-within-the-same-frame-into-a-notebook-u

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!