簡體   English   中英

動態創建小部件python tkinter並在畫布中添加滾動條

[英]create dynamically widgets python tkinter and adding scroll bar in canvas

我是Python和stackoverFlow的新手。 我正在嘗試從輸入的第一列CSV文件自動創建Checkbox小部件。 我怎樣才能使滾動條處於正確的位置。 下圖為輸入CSV文件之前的圖片,滾動條在右側

在此處輸入圖片說明

輸入CSV文件后的下圖,復選框小部件無法滾動

在此處輸入圖片說明

使用python 3.5的代碼

import tkinter as tk
from tkinter import ttk
import start
from tkinter.filedialog import askopenfilename
import numpy as np
import pandas as pd

LARGE_FONT=("Verdana", 12)

class MainPage(tk.Frame):
"""docstring for MainPage"""
def __init__(self, parent,controller):
    tk.Frame.__init__(self,parent)
    self.controller = controller
    self.getColumn = []
    self.createWidgets()


def createWidgets(self):
    self.createPanel()

def createPanel(self):
    nb = ttk.Notebook(self)
    nb.grid(row=1,column=0,columnspan=50,rowspan=49,sticky="NEWS")
    self.createMainPageTab(nb)
    self.createClassifyTab(nb)


def createMainPageTab(self,nb):
    self.featureSelection = tk.IntVar()

    page1 = ttk.Frame(nb)
    nb.add(page1,text="Preprocessing")

    selectFileFrame = tk.LabelFrame(page1,text = "Select File")
    selectFileFrame.grid(row=0,column=0,sticky="W",padx=5,pady=5,ipady=5,columnspan=10)

    selectRoleFrame = tk.LabelFrame(page1,text = "select Role")
    selectRoleFrame.grid(row=1,column=0,sticky="W",padx=5,pady=5,ipady=5,columnspan=1,rowspan=1)

    text = tk.Label(selectFileFrame,text="Select The File")
    text.grid(row=0,column=0, sticky="E")

    textSelectFile = tk.Text(selectFileFrame,width = 20, height = 1)
    textSelectFile.grid(row=0,column=1,sticky="WE",pady=3,padx=5)

    buttonSelectFile = tk.Button(selectFileFrame,text="browse...",command=lambda : self.load_file(textSelectFile,frameCheckBox))
    buttonSelectFile.grid(row=0,column=2,sticky="w")

    checkButtonFeatureSelection = tk.Checkbutton(selectFileFrame, text= "Feature Selection",variable = self.featureSelection)
    checkButtonFeatureSelection.grid(row=1,column=0,sticky="w") 

    buttonCek = tk.Button(selectFileFrame, text='Show', command= lambda : self.var_states())
    buttonCek.grid(row=2,column=0,sticky="W")


    #create canvas for scroll bar 
    canvasScroll = tk.Canvas(selectRoleFrame,bg="Yellow")
    canvasScroll.grid(row=0,column=0)

    vBar = tk.Scrollbar(selectRoleFrame,orient="vertical",command=canvasScroll.yview)
    vBar.grid(row=0,column=1, sticky="ns")
    canvasScroll.configure(yscrollcommand=vBar.set)

    frameCheckBox = tk.Frame(canvasScroll,bg="blue",bd=2,relief=tk.GROOVE)
    canvasScroll.create_window((0,0), window=frameCheckBox,anchor="nw")

    frameCheckBox.bind("<Configure>",self.resize(canvasScroll))


def resize(self,canvasScroll): 
    canvasScroll.configure(scrollregion=canvasScroll.bbox("all"),width=235,height=90)   


def readingCsv(self,fname):
    readCsv = pd.read_csv(fname)
    return readCsv

#event input csv file
def load_file(self,textSelectFile,frameCheckBox):
    fname = askopenfilename(filetypes=(("*.csv","Template files"),
                                       ("HTML files", "*.html;*.htm"),
                                       ("All files", "*.*") ))
    print(fname)
    mlabel = tk.Label(self,text="%s" % fname)
    mlabel.grid(row=0,column=3)
    # getText=self.textSelectFile.get()
    textSelectFile.configure(state=tk.NORMAL)
    textSelectFile.delete(1.0,tk.END)
    textSelectFile.insert(tk.END,fname)
    textSelectFile.configure(state=tk.DISABLED)
    read = self.readingCsv(fname)
    self.getColumn = self.getColumnFromCsv(read)
 #create checkbox
    if self.getColumn:
        for Column in self.getColumn:
            v = tk.StringVar()
            l = tk.Checkbutton(frameCheckBox,text=Column,variable=v)
            l.grid(sticky="w")


def getColumnFromCsv(self,readCsv):
    numeric_variables = list(readCsv.dtypes[readCsv.dtypes != "object"].index)
    return numeric_variables

def var_states(self):
    alabel = tk.Label(self,text="%s" % self.featureSelection.get())
    alabel.grid(row=3,column=0)
    print("tes : %d" %(self.featureSelection.get()))    

def feature_selection(self,chcekFeatureSelection):
    if self.featureSelection.get() == 1:
        pass



def createClassifyTab(self,nb):
    page2 = ttk.Frame(nb)
    nb.add(page2,text="Classify")

你有

frameCheckBox.bind("<Configure>",self.resize(canvasScroll))

意思是

result = self.resize(canvasScroll)
frameCheckBox.bind("<Configure>", result)

因此您沒有分配功能,而是執行了resize並分配了結果。

但是resize返回None所以最終您得到了

frameCheckBox.bind("<Configure>", None)

bind() (類似於command= )需要回調-這意味着沒有()和參數的函數名-像這樣

frameCheckBox.bind("<Configure>", self.resize)

因為您要發送額外的參數(並且默認情況下跳過通過bind發送的event ),所以必須使用lambda

frameCheckBox.bind("<Configure>", lambda event: self.resize(canvasScroll))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM