2013-06-12 30 views
1

昨天我在將兩個不同類插入筆記本時出現問題。不幸的是問題仍然存在。你可以找到它下面的鏈接以下:問題仍然使用Tkinter和Python在同一個框架內插入兩個不同的類到筆記本中

Problems inserting two different classes within the same frame into a notebook using Tkinter and 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() 

回答

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的子類,而不是使用函數,但現在不用擔心。如果遵循這種編碼風格,將來切換到面向對象的風格將非常輕鬆。

繼續像這樣工作,一次構建一塊。儘可能多地停止並運行代碼,確保它仍然正確調整大小,並按照您的要求進行佈局。分開處理每個部分,最終它們都會在一起工作。

+0

親愛的@BryanOakley,謝謝你的建議。其實我沒有使用面向對象的風格,所以從現在開始,我會繼續根據你的建議來構建我的應用程序,它們對我來說真的很有用!一旦我的代碼正在工作,並且我真的瞭解它,我將切換到面向對象的風格。 非常感謝你的確。 Héctor – Hector

相關問題