如何解决如何获取Power BI矩阵行中的总数
以下是Power BI表中的原始数据示例。
我想按Col B和Col C对Col D组的数目求和,并在矩阵行中将它们列出为合计数目。我怎样才能得到这样的欲望布局?看起来很简单,但无法弄清楚。 预先谢谢您
忘记提及C列比所列出的更多。因此,总和将与外面的切片器一起使用。
解决方法
您可以将计算出的列添加到表中,并在矩阵的行列表中使用它:
# coding:utf-8
# version 3.x python
import sys
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox # Librairie des fenêtres d'alerte
# ================= ID python ============================
print("TkVersion",TkVersion)
print("TclVersion",TclVersion)
print("Python version",sys.version_info)
import sys; print('Python %s on %s' % (sys.version,sys.platform))
# ================= Liaison file py =========================
import HV_DB_BackEnd
class Main:
def __init__(self,root):
self.root = root
self.root.title("--------------")
self.root.geometry("700x660+0+0")
self.root.config(bg="cadet blue")
if __name__ == '__main__':
root = Tk()
application = Main(root)
# --- Déclaration Variables - Tableaux
frames = [] # Liste Frames
global Liste_Full
Liste_Full = [] # Liste d'imbrication des L_List (sélection faites depuis Treeview)
# ======================== Frame Treeview ====================
MainFrame = LabelFrame(root,text="[TEST]",relief=FLAT)
MainFrame.place(x=5,y=5,width=1300,height=700)
# ============= Frame hébergeant les sous frame ==============
FrameCalc_1 = Frame(name='labels') #,relief=SOLID,borderwidth=1)
FrameCalc_1.place(x=15,y=300,width=800,height=300)
# ======================== Fonctions ========================
# [Treeview - Heading] - Empêche le redimensionnement des entêtes
def handle_click(event):
if HElist.identify_region(event.x,event.y) == "separator":
if HElist.identify_column(event.x) == '#1':
return "break"
if HElist.identify_column(event.x) == '#2':
return "break"
if HElist.identify_column(event.x) == '#3':
return "break"
if HElist.identify_column(event.x) == '#4':
return "break"
if HElist.identify_column(event.x) == '#5':
return "break"
if HElist.identify_column(event.x) == '#6':
return "break"
# [TreeView widgets] - Affiche Table
def DisplayData():
# Insertion Table BD dans TreeView
a = 0
for i in HV_DB_BackEnd.loadRecord():
HElist.insert('','end',text=i[0],values=(i[0],i[1],i[2],i[3],i[4],i[5]))
# print("Index",i[0])
a = a + 1
print(" - Nombre d'enregistrement _ lecture Table",a)
print(" - Nombre d'enregistrement _ lecture Treeview",len(HElist.get_children()))
# Suppression frame(s) générés dynamiquement & MàJ Liste_Full
def removeLabel(frame,var):
print("frames avant suppression",frames)
print("\n","len(frames) avant",len(frames))
frame.destroy()
Liste_Full.__delitem__(var.get())
ix = frames.index(var) # lit l'indexation de la frame
print("ix - Index de la frame à supprimer ",ix)
frames.pop(ix)
print("frames après suppression",frames)
# Mise à jour de l'indexation var des frame
# for i,v in enumerate(frames[ix:],start=ix):
for i,v in enumerate(frames[0:],start=0):
print("i",i)
v.set(i)
# print("v",i,v.get())
# var.set(v.get())
print("len(frames) après",len(frames))
print("frames restantes",frames)
# Création dynamiquement frame(s) contenant Labels selon la sélection faite depuis TreeView
def selectItem(frame):
var = IntVar()
global frames
frame = Frame(FrameCalc_1,borderwidth=0) # frame à générer dans la frame master FramCalc_1
frame.configure(relief=GROOVE)
frame.grid(row=len(frames) + 1,column=5,pady=1) # Nb de Colonne à générer - pady=intervale entre la prochaine
frame.columnconfigure(0,minsize=135) # Largeur de la Colonne
frame.columnconfigure(1,minsize=30)
frame.columnconfigure(2,minsize=30)
frame.columnconfigure(3,minsize=50)
frame.columnconfigure(4,minsize=30)
frame.columnconfigure(5,minsize=80)
frame.columnconfigure(6,minsize=0)
# === [Listing Table dans Widget Treeview] ===
curItem = HElist.focus()
Liste = HElist.item(curItem)["values"]
# === [Génére automatiquement de nouveaux widgets Labels] ===
var.set(len(frames)) # Compte le nombre de frame
print(var.get())
if var.get() < 5:
print("\n" + "var.get()",var.get())
L_Line = [] # Liste temporaire pour chaque sélection
# -- Génère Label - Affiche le Nb de Frame généré
Label(frame,textvariable=var).grid(row=0,column=0)
# print("frame.winfo_children()[0] - Label compteur",frame.winfo_children()[0]) # .labels.!frame.!label
frames.append(var) # liste des frames générée
# print("frames",frames)
# print("nombre de frames générée-addNewLabel",len(frames))
# -- Génére widget Label - Nom
if Liste[0] != "":
Label(frame,text=Liste[1]).grid(row=0,column=1)
L_Line.append(Liste[1])
# -- Génére widget Label
if Liste[0] != "":
Label(frame,text=Liste[3]).grid(row=0,column=2)
L_Line.append(Liste[3])
# -- Génére widget Label
if Liste[0] != "":
Label(frame,text=Liste[5]).grid(row=0,column=3)
L_Line.append(Liste[5])
# -- Génére widget Entry
if Liste[0] != "":
Input_gr = ""
# takefocus=True autorise la tabulation via la touche TAB
l=Entry(frame,width=4,text="",takefocus=True)
l.grid(row=0,column=4)
# print("frame.winfo_children()[3] ",frame.winfo_children()[3])
Input_gr = frame.winfo_children()[3]
L_Line.append(Liste[0])
# -- Génére Label -
if Liste[0] != "":
lb_pourcentage = ""
Label(frame,text="").grid(row=0,column=5)
lb_pourcentage = frame.winfo_children()[4] # Récupère le nom du label
# print("frame.winfo_children()[4] ",frame.winfo_children()[4])
L_Line.append(Liste[0])
# -- Génére widget Button
# takefocus=False supprime la tabulation via la touche TAB
b = Button(frame,text="Supprimer",width=10,takefocus=False,command=lambda: removeLabel(frame,var))
b.grid(row=0,column=5)
# print("frame.winfo_children()[5] - Button Supprimer",frame.winfo_children()[5]) # .labels.!frame.!button
# print("")
# print("frame.winfo_children()",frame.winfo_children())
Liste_Full.append(L_Line[0:len(L_Line)]) # Imbrique L_Line dans Liste_Full
print("Liste_Full",Liste_Full) # exemple [['test_14',53,'0.142',38,38],['test_0',92,'0.138',9,9]]
print("frames add",frames)
# ============= Style Police : Treeview_Button_Label ==============
style = Style()
# Treeview
style.configure('.',foreground="black") # Configuration TxT de la Frame contenant Treeview
style.configure('TTreeview',rowheight=15,font=('verdana',8,''),foreground='white',background='dim gray')
style.configure('TTreeview.Heading',foreground="black",cursor='none')
style.layout('TTreeview',[])
# ===== Treeview & Scrollbar Vertical/Horizontal [XY]
scrollbar_y = Scrollbar(MainFrame,orient='vertical') # Ascenseur Vertical
scrollbar_y.place(x=1236,y=24,height=169)
scrollbar_x = Scrollbar(MainFrame,orient='horizontal') # Ascenseur Horizontal
scrollbar_x.place(x=1,y=177,width=1236)
HElist = Treeview(MainFrame,selectmode="browse",columns=(1,2,3,4,5,6),show="headings") #,yscrollcommand=scrollbar_y.set,xscrollcommand=scrollbar_x.set) # style='TTreeview'
# En-tête
HElist.heading('#1',text="ID")
HElist.heading('#2',text="Nom")
HElist.heading('#3',text="C0")
HElist.heading('#4',text="C1")
HElist.heading('#5',text="C2")
HElist.heading('#6',text="C3")
HElist.column('#1',width=0,minwidth=0,stretch=False)
HElist.column('#2',width=160,minwidth=160,stretch=OFF)
HElist.column('#3',width=50,minwidth=50,anchor=CENTER,stretch=OFF)
HElist.column('#4',width=57,minwidth=57,stretch=OFF)
HElist.column('#5',width=120,minwidth=120,stretch=OFF)
HElist.column('#6',width=200,minwidth=200,stretch=OFF)
HElist.place(x=2,y=2,width=1236,height=175)
# Cache colonne(s)
exclusionlist = ['1'] # Colonne [ID] exclue d'affichage
displaycolumns = ['2','3','4','5','6'] # Colonne [xxx] affichées
for col in HElist["columns"]:
if not "%s" % col in exclusionlist:
pass
HElist["displaycolumns"] = displaycolumns
scrollbar_y.config(command=HElist.yview) # Ascenseur Vertical
scrollbar_x.config(command=HElist.xview) # Ascenseur Horizontal
DisplayData()
# Affiche Entry widget,via souris,la sélection des Datas [Colonnes Treeview]
HElist.bind('<ButtonRelease-1>',selectItem) # Le bouton de la souris a été relâché
# Désactive le redimensionnement des Entêtes Treeview
HElist.bind('<Button-1>',handle_click) # Gauche
HElist.bind('<Button-2>',handle_click) # Molette
HElist.bind('<Button-3>',handle_click) # Droite
root.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。