2017-03-22 125 views
1

我已經能夠使用此代碼循環按鈕

for i in range(0, num_sheets): 
      an_sheet = ttk.Button(self, text = "%s" % sh_names[i], command = partial(load_sheets)) 
      an_sheet.grid(row = 1, column = i+1, sticky='w', pady = 10, padx = 10) 

現在這些按鈕已被基於片材的在Excel工作表的數量產生,以產生在Tkinter的按鈕和也已分配他們代表的工作表名稱。但是,有一個功能可以打印每張表單的內容。

def load_sheets(): 
      for i,sheetname in enumerate(sh_names) : 
       xl_sheet = wb.sheet_by_name(sh_names[i]) 
       print() 
       print(sheetname) 
       row = xl_sheet.row(0) 
       for idx, cell_obj in enumerate(row): 
        cell_type_str = ctype_text.get(cell_obj.ctype, 'unknown type') 

       row = xl_sheet.nrows 
       for col_idx in range(0, xl_sheet.ncols): 
        print ('Column: %s' % col_idx) 
        for row_idx in range(0, row): 
         cell_obj = xl_sheet.cell(row_idx, col_idx) 
         print ('Row: [%s] cell_obj: [%s]' % (row_idx, cell_obj)) 

現在的挑戰是如何將函數綁定到按鈕上,以便當它被點擊時打印出它自己的內容。例如,當點擊一個名爲'工作表1'的按鈕時,應打印工作表1的內容。

這裏是代碼的完整結構。

class MainMenu(tk.Frame): 

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


     fname = join(dirname(dirname(abspath('C:/Users/qanda/OneDrive/Documents/Python Scripts/PEN'))), 'Python Scripts/PEN', 'Book1.xlsx') 
     wb = xlrd.open_workbook(fname) 
     sh_names = wb.sheet_names() 
     num_sheets = len(sh_names) 

     def load_sheets(): 
      for i,sheetname in enumerate(sh_names) : 
       xl_sheet = wb.sheet_by_name(sh_names[i]) 
       print() 
       print(sheetname) 
       row = xl_sheet.row(0) 
       for idx, cell_obj in enumerate(row): 
        cell_type_str = ctype_text.get(cell_obj.ctype, 'unknown type') 

       row = xl_sheet.nrows 
       for col_idx in range(0, xl_sheet.ncols): 
        print ('Column: %s' % col_idx) 
        for row_idx in range(0, row): 
         cell_obj = xl_sheet.cell(row_idx, col_idx) 
         print ('Row: [%s] cell_obj: [%s]' % (row_idx, cell_obj)) 


     for i in range(0, num_sheets): 
      an_sheet = ttk.Button(self, text = "%s" % sh_names[i], command = partial(load_sheets)) 
      an_sheet.grid(row = 1, column = i+1, sticky='w', pady = 10, padx = 10) 

回答

1

定義一個函數來打印一張紙的內容,將圖紙號作爲參數。然後,使用functools.partial的命令與每個按鈕關聯:

def print_sheet(sheet_number): 
    ... 

for i in range(0, num_sheets): 
    an_sheet = ttk.Button(..., command = partial(print_sheet, i)) 
    ... 

下面是一個循環創建按鈕的短,但完整的例子:

import tkinter as tk 
from tkinter import ttk 
from functools import partial 

root = tk.Tk() 

def print_sheet(i): 
    print("printing sheet %d" % i) 

for i in range(0, 5): 
    button = ttk.Button(root, text="Button %d" % i, 
         command=partial(print_sheet, i)) 
    button.pack() 

root.mainloop() 
+0

什麼是functools.partial?這聽起來很有用 –

+0

@JoshuaNixon:我以爲你知道,因爲你發佈的代碼正在使用它。至少,我假設當你在代碼中使用'partial'時,即使你錯誤地使用了'functools.partial',你也會使用'functools.partial'。如果你不知道它做了什麼,請查看它。 –

+0

@BryanOakly詞部分不在我的代碼? –

0

所以你問的是如何遍歷一組函數並分配它們?

你可以使用字典

實例從我的A級計算的課程

self.screen_info = {"Email Customer": {"button_names": ["Enter Email"],   "commands": [self.email_from_email]}, 
        "Text Customer": {"button_names": ["Enter Number"],  "commands": [self.text_from_number]}, 
        "Backup Database": {"button_names": ["Choose Location"],  "commands": [backup_database.backup]}, 
        "Export Database": {"button_names": ["As .txt", "As .csv"], "commands": [lambda: export.main("txt"), lambda: export.main("csv")]}} 


def populate(self): 
    for key in self.screen_info.keys(): 

     self.screen_info[key]["parent"] = tk.Frame(self.screens, width = 300, height = 300, bg = "#E6E6FA") 
     self.screen_info[key]["parent"].place(relx = 0.5, rely = 0.5, anchor = tk.CENTER) 

     for num in range(len(self.screen_info[key]["button_names"])): 
      self.screen_info[key]["button_names"][num] = tk.Button(self.screen_info[key]["parent"], 
                    width = 20, 
                    text = self.screen_info[key]["button_names"][num], 
                    font = ("Ariel", 11, "bold"), 
                    command = self.screen_info[key]["commands"][num]) 
      self.screen_info[key]["button_names"][num].place(relx = 0.5, y = 60 + num * 40, anchor = tk.CENTER) 

因此,這將通過字典創建一切迭代,並指派命令。我使用「導出數據庫」拉姆達的功能需要一個參數,如果我沒有使用拉姆達那麼函數將盡快爲項目啓動

編輯我的字典覆蓋每個鍵值運行與相關的小部件,但如果你不是再次提到它們,你甚至不需要設置變量,它們的鍵