1

昨日、2 つの異なるクラスをノートブックに挿入する際に問題が発生しました。残念ながら、問題はまだ残っています。以下のリンクから見つけることができます。

Tkinter と Python を使用して、同じフレーム内の 2 つの異なるクラスをノートブックに挿入する際の問題

私は提案に従いました。計算から値を取得するボタン(不要)を削除してコードを変更しました。代わりにエントリを入れて (ちなみにこれは機能しません)、不要なインポートなども削除しました。ただし、スクリプトは機能せず、ノートブック内のフレームにクラスを挿入することもできません。あなたが私を助けてくれることを願っています!

前もって感謝します

ヘクター

コードは次のとおりです。

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

このコードにはあまりにも多くのバグがあり、私たちがあなたを助けることはできません. 明らかに苦労しているので、アドバイスをさせてください。アプリ全体を一度に構築しようとしないでください。一度に 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()

強調させてください:それが機能し、コードが何をしているかを理解するまで、他に何もしないでください

満足したら、タブの 1 つに集中できます。各タブはフレームで始まるため、フレームのみを作成する関数を作成します。親でフレームをパックまたはグリッドするのではなく、この関数がフレームを返すようにします。経験則として、コードの理解と変更が難しくなるため、関数またはクラス パック/グリッド自体を親に含めないでください。各フレームを自己完結型のものにし、それを作成するコードにレイアウト方法を決定させます。この方法で 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、今はそれについて心配する必要はありません。このスタイルのコーディングに従えば、将来オブジェクト指向スタイルに切り替えるのはかなり楽になります。

このように作業を続けて、一度に 1 つのピースを作成します。できるだけ頻繁に停止してコードを実行し、サイズが適切に変更され、希望どおりにレイアウトされていることを確認してください。各セクションに個別に取り組むと、最終的にはすべてがうまく連携します。

于 2013-06-12T17:59:42.003 に答える