1

昨天我在笔记本中插入两个不同的类时遇到问题。不幸的是,问题仍然存在。您可以通过以下链接找到它:

使用 Tkinter 和 Python 将同一框架内的两个不同类插入笔记本时出现问题

我遵循了这些建议,我修改了删除从计算中检索值的按钮(不必要的)的代码。现在我已经输入了一个条目(顺便说一句,这不起作用),并且还删除了不必要的导入等等。即使脚本不起作用,也不会将类插入笔记本的框架中。希望你能帮我!

提前致谢

赫克托

这是代码:

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

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

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

f= tkFont.Font(family="verdana", size=12,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 = ttk.Frame(notebook);
ContainerOne.pack(fill='both', expand=True);

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

canvas1 = tk.Canvas(ContainerOne, width=950, height=450,bg=c1)
scroll = ttk.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 = tk.Frame(canvas1, width=900, height=450)#,bg=c1,bd=22)
canvas1.create_window(630, 270, window=frameOne)

class MyListbox:
    def __init__(self, parent):
        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 = ttk.Frame(self.parent)
        mainFrame.pack(fill='both', expand='yes')

        fr_left = ttk.Frame(mainFrame)
        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 = ttk.Frame(mainFrame)
        fr_right.pack(fill='both', expand='yes', side='right')

        fr_up = ttk.Frame(fr_right)
        fr_up.pack(side='top', expand='yes')

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

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

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

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

        ttk.Label(fr_up, text='Address').grid(row=4, column=0, sticky='w')
        self.entAddress = ttk.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()

        ttk.Label(self.parent,text='Num 1').grid(column=2, row=5, sticky='w', pady=3)
        ttk.Label(self.parent,text='Num 2').grid(column=2, row=6, sticky='w', pady=3)
        ttk.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.entry = ttk.Entry(text='Calculate',width=8,command=self.Calc)
        self.entry.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 = ttk.LabelFrame(frameOne, text=" 1. Select People: ")
    stepOne.grid(row=0, column=5, sticky='nsew', \
             padx=5, pady=5, ipadx=5, ipady=5)

    stepTwo = ttk.LabelFrame(frameOne, text=" 2. Calculation : ")
    stepTwo.grid(row=7, column=5, sticky='w', \
             padx=5, pady=5, ipadx=5, ipady=5)

    app = MyListbox(stepOne)
    app2 = Calculation (stepOne)
    root.mainloop()
4

1 回答 1

2

您在此代码中有太多错误,我们无法为您提供帮助。让我给你一些建议,因为你显然在苦苦挣扎:不要试图一次构建整个应用程序。一次只专注于一个部分,把它做好,然后继续前进。

例如,重新开始您的应用程序并创建主窗口和笔记本,仅此而已。让那部分工作。为您的两个笔记本选项卡创建一个虚拟框架,以证明您的笔记本正在工作并且您了解如何添加选项卡。在这个简单的程序按预期工作、调整大小、启动和停止之前,不要做任何其他事情。为您创建的每个小部件提供独特的背景颜色,以便您可以直观地看到每个小部件。

例如:

import Tkinter as tk
import ttk

root = tk.Tk()
notebook = ttk.Notebook(root)
notebook.pack(fill="both", expand=True)

tab1 = tk.Frame(notebook, background="red")
tab2 = tk.Frame(notebook, background="green")

notebook.add(tab1, text="Tab 1")
notebook.add(tab2, text="Tab 2")

root.mainloop()

让我强调一下:在你完成工作并理解代码在做什么之前不要做任何其他事情

对此感到满意后,您现在可以专注于其中一个选项卡。每个选项卡都以框架开头,因此请创建一个仅创建框架的函数。让此函数返回框架,而不是在父级中打包或网格化框架。根据经验,您永远不应该在其父级中拥有函数或类包/网格本身,因为它会使您的代码难以理解和修改。让每一帧都成为一个独立的东西,并让创建它的代码决定如何布置它。相信我,以这种方式编写 GUI 要容易得多。

例如:

def tab1(parent):
    frame = tk.Frame(parent, background="pink")

    return frame

然后修改你的代码是这样的:

import Tkinter as tk
import ttk

<put your definition of tab1 here...>

root = tk.Tk()
notebook = ttk.Notebook(root)
notebook.pack(fill="both", expand=True)

tab1 = tab1(notebook)
tab2 = tk.Frame(notebook, background="green")

notebook.add(tab1, text="Tab 1")
notebook.add(tab2, text="Tab 2")

root.mainloop()

好的,现在停下来,运行该代码,并确保您了解发生了什么。这一切还在工作吗?现在,在 中的空白行中tab1,您可以添加此容器的所有小部件。您可以将它们打包或网格化在框架内,您不必将所有这些都传递出去。您只需将容器传递给调用者。最终,您可以学习如何创建子类tk.Frame而不是使用函数,但现在不用担心。如果您遵循这种编码风格,那么将来切换到面向对象的风格将非常轻松。

继续像这样工作,一次构建一件。尽可能多地停止并运行代码,确保它仍然可以正确调整大小并按照您想要的方式布局。分别处理每个部分,最终它们将完美地协同工作。

于 2013-06-12T17:59:42.003 回答