I'm trying to insert a text into textbox from within a function outside of class because i'm using threading.
code:
import os
import glob
import threading
from Tkinter import *
import Tkinter as tk
import ScrolledText as tkst
def searchfunc(string, filetype, directory):
print 'string : '+string
print 'filetype : '+filetype
print 'directory : '+directory
os.chdir(directory)
for file in glob.glob('*'+filetype):
if string in open(file).read():
print '[-info-] textstring found in >> '+file
searchresults.insert(INSERT, file) # problem line
else:
print '[-info-] text string not found in : '+file
pass
class name:
def __init__(self, top=None):
...
def search():
string = self.stringtextbox.get()
filetype = self.filetypetextbox.get()
directory = self.directorytextbox.get()
t = threading.Thread(target=searchfunc(string, filetype, directory))
t.daemon = True
t.start()
But it give me the following error :
NameError: global name 'searchresults' is not defined
and ofcourse if i used the name "self.searchresults" will give me an error as well because as you know self is a discriptor within the class itself
Related
I'm having trouble decoding an image when I import it from another file.
I have four .py files to make two buttons.
In the first, on line 21, the button works and brings the image, in the second, on line 28, which is imported from another file, it appears as a button but without an image. How can I resolve this?
lab.py
import tkinter as tk
import base64
from imagens import *
from cores import *
from widgets import *
class Janela(Images):
def __init__(self) -> None:
self.images_base64()
self.tamJanela()
def tamJanela(self):
self.janela_doMenu = tk.Tk()
janela = self.janela_doMenu
# janela.state('zoomed')
janela.title('Disk Gás Gonçalves')
janela.configure(background=preto_claro)
janela.geometry("%dx%d" % (janela.winfo_screenwidth(), janela.winfo_screenheight()))
# Here the code works ###############################################################
self.img_icoName = tk.PhotoImage(data=base64.b64decode(self.editUser))
self.rotulo_nome2 = tk.Button(master=janela, image=self.img_icoName, activebackground='#00FA9A', bg='#4F4F4F',
highlightbackground='#4F4F4F', highlightcolor='#4F4F4F')
self.rotulo_nome2.grid(row=0, column=0)
# Here the code does not work #######################################################
# I'm importing from widgets.py #####################################################
Botoes(janela)
janela.minsize(1200, 640)
janela.mainloop()
Janela()
widgets.py
import tkinter as tk
import base64
from imagens import *
from cores import *
class Botoes(Images):
def __init__(self, local) -> None:
self.images_base64()
self.local = local
self.bt()
def bt(self):
self.img_icoName = tk.PhotoImage(data=base64.b64decode(self.editUser))
self.rotulo_nome2 = tk.Button(master=self.local, image=self.img_icoName, activebackground='#00FA9A', bg='#4F4F4F',
highlightbackground='#4F4F4F', highlightcolor='#4F4F4F')
self.rotulo_nome2.grid(row=1, column=0)
cores.py
preto_claro = '#4F4F4F'
verde_médio = '#00FA9A'
vermelho_salmão = '#FA8072'
azul_seleção = '#F0FFFF'
verde_limão = '#00FF00'
branco_gelo = '#EDEBE6'
imagens.py
import base64
class Images:
def images_base64(self):
self.addUser = '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'
self.editUser = 'iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAFiVAABYlQHZbTfTAAAAB3RJTUUH5gkWFhApZHBt8gAADaRJREFUaN7NmXtwVNd9x7/n3Nfu3ae0Wu1qtXpLICNhG/AjDrEhAQS4pHadGbedcRPHIAxx/ODRJs6jbrHjtHHrqRPjENu1HXDbqRvbk+IgwHVcB49pDY4BSwgJCb2FHvvevXf37t57T/8QUAN6rBB0+pu5M3tn73l8fr/fOfd7fpfgKthrm9dO/ofBAbyO+1/YfzWGmdbIXCZPCYFumuB5DrLVigK3C7fefCNswRK8/3YLxkJhpNMZMMZAKcX9P2/5/wPy2uY7QQiDYZhwOOw49lm7UBbwl9ps1nmSJFUKPF8IgMvl9DElrR6PRGKtpQG/mkikIAg8vrnr2kRnViCvbV6L8VAYvmIvBofOisFS/xc8hQX3ejwFywrczjJZlmVBEHgCEC2bzUUisdDw2bH9o2Pjz61bs+L4W3v3QxSEawKTN8hrm9cikUzB6ylEIpkK+H3ehyvKS78RDJaUuBwO8AJ3WXemaSIajeFU55ljPb392+rn1fz2ROspCIIA0zSvaqrlBbLnoTvx0cfHcPttN0FNZ6rKgiU/WVBf90eBkmKOchzA2DQjEKSSKRz7rP337R1d65tf2n3sjW0PQVFUUErBcTz+7Pm9cwbh8nnoD5fUoKzUj6SieCrKS39y4/UL/iQQ8FFC8guoKEmQrVa/YRiLjv/m38uUlKqNjoVGrFarSSnB20dO/9+A3LWkBi//cj9Z9eWbHmxsmP9osNSfV7vPmyxbid/nDXq9nmUWSWqilGRD4cgxQeCNu2+uw6+Pdl1bkFc3rYEoCmi4rry2tqbix/PrqgMcN2sOgBDwAg+7TYa3qNDFGG5RVLWzvq6mfTwUmTMInXl8gvp5tXC7nF8J+H31oijOehBdN6AqaTDTBBiDIAiorizz+IqL1h8+8mlBvik6JxDTZNjb8p7kdDiWFrhds6MgBLmcjq7eXrT1deFM/wByOR0Agyxb4S3yLHY6HPMtFmlqdXC1QAglcLudDrvNWitZxOl3qEsgVEVFZ08P+BIJDU0LYBZRdPf3wdANEErhdNrdVqtU53DY5wSRFwglBJIg2ERRLLhobRAy+QVA07IYHDyLjsFeOOcXoHpJFWSnjJrFVWBuDiNjIYAQSKIoCoLgq6+rnjMIP7NjCQghHCFkgoIApmEikVSgptMwDOPCc6ZpIp3VkDY0WLxW1C6phcNjBxgAxkB5DoH6EvR/1Ae/7gXHcYRSKlfftx6HPjpybUFMk0HXjXRO11PMZNBNA939/cgIOdg8NvAiBzBMCEOOg9tRiDKPA1a7BYTSi1ORMcguGUwEsloWpmkyZpqZwTd2X/uImKaJlKIm0un0QE7PLY7GEtCdDAtuuw6CKPyvNmC4+Ddjk64nylFQgUI3DGQympbN5gZPtJ4CuXIhPtHvTA8QAjz+9lE1mVKPp1IqUqoKT7AQgiRMTNQ8d136ewYzDBPxRDKsqulTiUQKeW4hVw7iqQN+9edfY0omeTwUDismM0D5GZvN6J1MJoNwNHI6Yyh9OjSULDLm1OWMqSU5GURnRC4gzlURNWy1ic45HMfOcQAIhSMwbKnqeV9yNlIIH+RymTn1OXNqgcDIkiK3z3mHxcvT8VBkTvlMyMT2PJ4IwV9XUC4Iwhcq51fMzTP5gACAaZgZxliioFSGKeXA8n0pTmE5IwfZz0Oy87ppmNHQaAhzVSkzgjDGEItEw2pSOQROR+A6BwQLwVxWpysgoKjSBjWpDGQz2n8nY/E8XToHEPBAoDxopBV1d2Qs9CmjWdAZV9Y0RgDeCqQSMS0eib2ajCfa9KwOpl9rEAPIahqamve3Rscjjyai8cNzSi0G5LRccvzs6N+qKeVnDrdLBwFWP3hgTiAz+nZ18wEceHE19u9aheLS4KFkLLY7l83enE/bycw0DBiG3p6IRnbaXe4YLwgwcvmF46PlywE64fvzziSETMiffDpYvfEAKMchGYshq6VPKsl4LG8V/HkjBFomjXQqeVJJxOLMNGFkc2hqnrmqsu9r96I8FQOjFLdt3IjE6KglNjQkeoLBCXmU/yQALZOGkky2xUJjn2bSKma91TCGWHhcTSVi7zbc9EWNEoqmjTOn1NNP/B3WvvkG3lm6FrZYxP3Jnj0PBhcufKXshht+ER8buyenaZa8z6yv7+3GfetqsPCmW9NnB3qZxWptcroLxbxPd4RASSXQ33nqvdDI8LO5rKYwBrz+Tve0zb77zEv4q+8/jB88/QJGJNkrO51PzispftxXVbnIVVx8IycIX8lpmjKrw/d9X61BeHQESjLeYxpmsUW2LbY5nDNH9VxK9XW2nxkd7PuO2+NtS6tJrNn07rTNnnr2Gdy67dvYbS9BQtU8wWDpk9K8+mZB4MUATyBKEiSbzZZJJhtmBfL6O93YcG8DKM9n06nUoJpKrON5wSXbHKCTFSTORUtJxNHT0Yqz/T2vDp458xIvCIxyFK/vnToa77/8ZXz9Wy/in//eDSWTKQqUlu+4fmHjhnkLFghDjCIZjsDLcuAohRKJyLN+DWW17HmBkhJELhsLD6O7/TjGhweRy2oXToqMMaRiUQx0d6Cvuw2MaeB4LvGNp75nUo5i9caDU45x8KXVqFn/W+z86XeQTGlFPn/5UzcsbGyuLC8TLJKImoYGjNVfj1ZqRVpRoSnK7/PaQrftPARKKQzDwMEcRZV0HHX6L01BKEWBtwBaRkN4tBeR8WEUFJVAEEUkYxGkEmGIFgFujwtaJgM6OsZ27b8Bw8yPrc//ABPykeHZb9/+OYg1WLXhe/iPf1yL+XzYU1Z1y46YrfaBwkKPQCkFYwyiIKC2oRGnslmMf9Df7otGn+CnB/gQqkLAmAlR4vHJx91cdU3A18WWVKcl+ZY7zMMuQgisNhkW2YpMOoNoaACMMfACD7fXDZ6fGEJLM4ybtUvO9Kl3ZzWpK5lI9d2+vDF5srUfW372OxBKsEZ8Cqs2/CXefXkHMmrK4w3U7micH9iQJIrQ2nsctPpGOOy2iczIakjo5ulet3/7Xx88eGDKLWfb84egGyasVhGjI1GLp8h5s9Ml3+Vy25c5nbYqu0V3+KN7hEpPlAgWy+Xaa8LZ54whPJ5ED7fOjEmL0qmkEorHlWPxmLIvmVBb7vv68oF//ZcPMa9WRM3gE1CVlKe4pGxHVX1jc3FpmUAIwekhE63DAVTULAIhDMc/a+vo6up+7Efb1+/ftXnb5JXG7S98CMMw8fQjd+Ddwz2NgaDnh5VVJT+sqQ00lZV7A0Vel+xwuziDSISFT0C2chPn80mMEEBNKhjXqyHW3EXcngLRU+RyF3ld9U6nvFoQ+Ns/OdqtJxNqdyD7QVZS2y+DAACPk4AnSbSfiaFnYOx0b++ZLU9uXd+S4T1IuTyXg0xAGBgfi/GfdkXuKasofm5efdkflAa9dptNAv3chInVj0xGhxntgEUEKMefr7pgQjmYUBIpjKpe6BV/CiJ7ATYhK0SRh9Nl4wo9zqBkEVeajPj05NmzC/zxrVX1jRuLS8uFi95RhEDmFIT6WzvbuqNbdmx/ZV/GkgMRJPz48c0Xg2zbeQimYSIUivPlFb77q2tLnqmbH6xxumRM+uIjFMRZjbThgBoZgpGOw9A16Nks0oqGaNxEmDRAL78X1B6cNGKCwMFV4BBtgraoOPdfTQvr/cuLS8vFSyEyioLejrYOZaRtyzcfeqHlF4XtUFgRnv6Lb13I5AsQhmHiHx5Zhu++ePiPq2sDz9XUBXyiyOclq1gmDBY/DZIZATFzYIILzF4J4qgE4cWpzy8EYFoCfP+bqHaOwldaiskgejpaO4d6uh5duX7f/rd23g3CS7hn0xsXLUkAwGM//U9YZQu0THZxVXXJnvqGigUWi5C/Nvx8KWiy+5kgXKPwBaaGGO7pemzF+n0tLT9fCY7jL5P99Hw0KOUwPhqzeYpcj1RU+WYHcX7CbJr7qwGxawU4npv07MKfawOb3QqOo0tLAp51Lrf9ilR63kYAlomD638T1e6xySHUSyOxAhzPT6kIKDBRFu1o7xddbts9Xp/bQ+ncv1dMH4k4+P5foWaqSKgKek61dg5dmk7TyBq6feeH4DgO3mJ3wF1gX2q3Wa5pNEwtBf3UPyEg9MAfDE4N0dv12MoLEBxWP3hw2n6pIiqwWERYrVKd0ymXcfwVfFabRTTU/iOwx04gpyaRVpQpI7HygX0tLbtWTqTTDBAAQOWcDKdLhigJlVbZYqN06k8fc70MTQFGjqLC74FMBAx0nEQqEQcoPQ/RNdTTtWXlRemUX1GCJyBwOGVEIylHJJTIZLM6mXMFbtJoUCDaJtZiRHTYCkGoHTQRw3B3JzyBUowND3YPnuna2tTcsu832krwPJc3BHBu1+rrGUUup7/T3TXcdS5lrzIIQSatSlz/W48uXC5/ieMoTAbYbQ4kR9NoO3K0K5tVtjY3t+zd+/wKkDzWxKQgVqsEwzA6RUno5Lg5lvwmsYH2j3Hid//WIEqyX6ZePLDGAso0DI1Gh0fHo+9ntOTLgYKTH+zcuRKUUty5aXYQE666xra8aR0qPTnSMSp+3zCxg6Mk98V66+lFZdreeCLx65FQ/MSyW4Oqkk5BFHis3XRlhbprDrJ0xTpwBL6sQd5iQICAvWLo+pss2dWx/qt1hpHTYDACSoCH/+a9Kx7nfwAPPztG5sk4owAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOS0yMlQyMjoxNjoxNyswMDowMOu8Z3oAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDktMjJUMjI6MTY6MTcrMDA6MDCa4d/GAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg=='
I tried to create a button by importing the base64 image from another file.
There are two buttons in the application, one works and the image appears, the other does not work and the image does not appear. I would like to make the second one work.
All the code will generate this image. The bottom button that doesn't show the image is in the widgets.py file
I don't know why, but when I import it, it doesn't work.
Thank you in advance for your attention and I apologize if something was wrong or out of standard, my English is not very good.
It is because there is no variable referencing the instance of Botoes(), so it will be garbage collected (so as the image inside it).
Just use a variable to store the instance of Botoes():
class Janela(Images):
def __init__(self) -> None:
self.images_base64()
self.tamJanela()
def tamJanela(self):
self.janela_doMenu = tk.Tk()
janela = self.janela_doMenu
# janela.state('zoomed')
janela.title('Disk Gás Gonçalves')
janela.configure(background=preto_claro)
janela.geometry("%dx%d" % (janela.winfo_screenwidth(), janela.winfo_screenheight()))
# Here the code works ###############################################################
self.img_icoName = tk.PhotoImage(data=base64.b64decode(self.editUser))
self.rotulo_nome2 = tk.Button(master=janela, image=self.img_icoName, activebackground='#00FA9A', bg='#4F4F4F',
highlightbackground='#4F4F4F', highlightcolor='#4F4F4F')
self.rotulo_nome2.grid(row=0, column=0)
# need a variable to store the instance of Botoes
# to avoid garbage collection
botoes = Botoes(janela)
janela.minsize(1200, 640)
janela.mainloop()
Result:
I am trying to build a Tkinter UI with a button where the user chooses a main file and based on information in that file, the script would get some information about some secondary files. Upon choosing the main file, I am trying to use the file path of the main file to get the file path of the secondary files. However, because I am calling a function "open_main_file()" twice, I get two dialog boxes where the user will have to choose the main file twice instead of once. How can I circumvent that?
My code looks like this:
import pandas as pd
from tkinter import *
from os.path import dirname
from tkinter import filedialog
root = Tk()
def open_main_file():
return filedialog.askopenfilename()
def parse_main_file():
return pd.read_parquet(open_main_file(), engine='pyarrow')
def get_some_ids():
return parse_main_file()['some_ids'].iloc[0]
def get_list_of_other_files():
other_files_path = dirname(dirname(dirname(open_main_file())))
list_of_other_files = []
for f in get_some_ids():
list_of_other_files.append(glob.glob(other_files_path + '/identifier=' + str(f) + '/*'))
return map(''.join, list_of_other_files)
myButton = Button(root, text='Open File...', command=get_list_of_other_files).pack()
root.mainloop()
try not to use a function in other functions. In this case, you are calling a function one time in another one, and one time in the main code. That is why you get file dialog 2 times. Use the returned item and give it to the next function. You can code like this:
import pandas as pd
from tkinter import *
from os.path import dirname
from tkinter import filedialog
root = Tk()
def open_main_file(): # This function is not necessary
return filedialog.askopenfilename()
def parse_main_file(main_file_path):
return pd.read_parquet(main_file_path, engine='pyarrow')
def get_some_ids(main_file_path):
return parse_main_file(main_file_path)['some_ids'].iloc[0]
def get_list_of_other_files():
main_file_path = filedialog.askopenfilename()
other_files_path = dirname(dirname(dirname(main_file_path)))
list_of_other_files = []
for f in get_some_ids(main_file_path):
list_of_other_files.append(glob.glob(other_files_path + '/identifier=' + str(f) + '/*'))
return map(''.join, list_of_constituent_files)
myButton = Button(root, text='Open File...', command=get_list_of_other_files).pack()
root.mainloop()
Error Message
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Patrick\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "<string>", line 20, in set_training_data_directory
File "<string>", line 252, in printer
AttributeError: 'Navigate' object has no attribute 'Listbox1'
In this code, If I call the function set_training_data_directory, it should also call printer from the Toplevel1 which it does. However, as the method printer is expecting self as an argument, any instance from the Navigate class that I pass as an object says "object has no attribute 'Listbox1". I've passed self and self.main_g as an argument and so far the error I get is "object has no attribute 'Listbox1"
Module Name: All_Classes
import import_ipynb
import Navigator
import Listings
import Main_GUI
Module name: Main
from tkinter import *
import import_ipynb
import Main_GUI
root = Tk()
top = Main_GUI.Toplevel1(root)
root.mainloop()
Module name: Listings
import import_ipynb
from tkinter import filedialog
import sys
import tkinter as tk
import os
import All_Classes
class Lists:
#Making a Navigator Object
#List of the training data
def get_list_of_training_data(self):
training_data_names = []
directory = self.get_training_dir()
for classes in os.listdir(directory):
for data in os.listdir(os.path.join(directory,classes)):
print(data)
training_data_names.append(data)
return training_data_names
Module name: Navigator
import import_ipynb
from tkinter import filedialog
import tkinter as tk
import All_Classes
class Navigate:
def __init__(self):
#Global Navigation variables
#Training data directory
self.TRAINING_DIR = ''
#Model directory for loading
self.MODEL_DIR = ''
#Sound file path for loading
self.SOUND_FILE = ''
self.listings = All_Classes.Listings.Lists
#self.g = GUI.Toplevel1()
self.main_g = All_Classes.Main_GUI.Toplevel1
#Function for Data directory
def set_training_data_directory(self):
self.TRAINING_DIR = filedialog.askdirectory()
p = self.listings.get_list_of_training_data(self)
print(p)
self.main_g.printer(self)
def get_training_dir(self):
return self.TRAINING_DIR
Module Name: Main_GUI
import import_ipynb
import All_Classes
import sys
import tkinter as tk
import tkinter.ttk as ttk
py3 = True
class Toplevel1:
def __init__(self, top=None):
self.nav = All_Classes.Navigator.Navigate()
#'''This class configures and populates the toplevel window.
# top is the, toplevel containing window.'''
_bgcolor = '#d9d9d9' # X11 color: 'gray85'
_fgcolor = '#000000' # X11 color: 'black'
_compcolor = '#d9d9d9' # X11 color: 'gray85'
_ana1color = '#d9d9d9' # X11 color: 'gray85'
_ana2color = '#ececec' # Closest X11 color: 'gray92'
self.style = ttk.Style()
top.geometry("832x674+650+150")
self.style.configure('TNotebook.Tab', background=_bgcolor)
self.style.configure('TNotebook.Tab', foreground=_fgcolor)
self.style.map('TNotebook.Tab', background=
[('selected', _compcolor), ('active',_ana2color)])
self.TNotebook1 = ttk.Notebook(top)
self.TNotebook1.place(relx=0.012, rely=0.0, relheight=0.895
, relwidth=0.978)
self.TNotebook1.configure(width=814)
self.TNotebook1.configure(takefocus="")
self.TNotebook1_t0 = tk.Frame(self.TNotebook1)
self.TNotebook1.add(self.TNotebook1_t0, padding=3)
self.TNotebook2 = ttk.Notebook(self.TNotebook1_t0)
self.TNotebook2.place(relx=0.037, rely=0.113, relheight=0.461
, relwidth=0.412)
self.TNotebook2.configure(width=334)
self.TNotebook2.configure(takefocus="")
self.TNotebook2_t0 = tk.Frame(self.TNotebook2)
self.TNotebook2.add(self.TNotebook2_t0, padding=3)
self.TNotebook2.tab(0, text="Audio Files", compound="left", underline="-1"
,)
self.TNotebook2_t0.configure(background="#d9d9d9")
self.TNotebook2_t0.configure(highlightbackground="#d9d9d9")
self.TNotebook2_t0.configure(highlightcolor="black")
self.Button2 = tk.Button(self.TNotebook1_t0)
self.Button2.place(relx=0.123, rely=0.78, height=40, width=190)
self.Button2.configure(activebackground="#ececec")
self.Button2.configure(activeforeground="#000000")
self.Button2.configure(background="#d9d9d9")
self.Button2.configure(disabledforeground="#a3a3a3")
self.Button2.configure(foreground="#000000")
self.Button2.configure(highlightbackground="#d9d9d9")
self.Button2.configure(highlightcolor="black")
self.Button2.configure(pady="0")
self.Button2.configure(text='''Load Training Data''')
self.Button2.configure(command= self.nav.set_training_data_directory)
self.Listbox1 = tk.Listbox(self.TNotebook2_t0)
self.Listbox1.place(relx=0.0, rely=0.0, relheight=1.008, relwidth=1.012)
self.Listbox1.configure(background="white")
self.Listbox1.configure(disabledforeground="#a3a3a3")
self.Listbox1.configure(font="TkFixedFont")
self.Listbox1.configure(foreground="#000000")
self.Listbox1.configure(width=334)
#Init Scrollbar object
self.scroll1 = tk.Scrollbar(self.Listbox1)
self.scroll1.configure(command=self.Listbox1.yview)
self.Listbox1.configure(yscrollcommand = self.scroll1.set)
def printer(self):
print("printer Reached")
self.Listbox1.pack()
self.scroll1.pack(side = "right",fill = 'y')
for i in range(20):
self.Listbox1.insert(tk.END,i)
I am pretty new with object in python. If you happen to have an answer, I would appreciate it. Also could this be a bad way of designing?
Well. I had a look, and it definitely seems to be a issue with how you write and use classes. In Navigator you call the Lists class, but you don't instanciate it:
self.listings = All_Classes.Listings.Lists
To make an instance you must end the class name with parenthesis. Thus when you run the method get_list_of_training_data(self) there is no self to pass as self is the name of the instance.
Same thing with self.main_g = All_Classes.Main_GUI.Toplevel1.
From my perspective it looks like you build a complicated structure of classes when you really don't need them. To quote Jack Diederich: "The signature of this is not a class is that it has two methods, one of which is init". YouTube clip: Stop Writing Classes
On my end I'm having trouble to get it running without errors because my os.path.join() delivers dysfunctional paths, don't know why.
But: have look and see if you can make the code not so fractured and I think it will be easier to spot problems.
I'm using Kivy example code to get file path from two different files.
My goal is to use the file path to open and manipulate data from the file.
My problem is to pass the file path into the open file command in the test function below.
Here is my Code:
from kivy.app import App
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
import re
import pandas as pd
class DropFile(Button):
def __init__(self, **kwargs):
super(DropFile, self).__init__(**kwargs)
# get app instance to add function from widget
app = App.get_running_app()
# add function to the list
app.drops.append(self.on_dropfile)
def on_dropfile(self, widget, path):
# a function catching a dropped file
# if it's dropped in the widget's area
if self.collide_point(*Window.mouse_pos):
self.text = path
def test(self):
minimum_wage = open(**FILE PATH HERE**)
LinesToString = ''
for line in minimum_wage:
LinesToString += line
patFinder = re.compile('\d{5}\s+\d{5,9}')
findPat = re.findall(patFinder, LinesToString)
empno_list = []
pattern = '(\d{5})\s+(\d{5})'
for string in findPat:
match = re.search(pattern, string)
empno = match.group(2)
empno_list.append(empno)
MinimumWage = pd.DataFrame({'EMPNO': empno_list})
MinimumWage.set_index('EMPNO')
print MinimumWage.head()
print MinimumWage.shape
class DropApp(App):
def build(self):
# set an empty list that will be later populated
# with functions from widgets themselves
self.drops = []
# bind handling function to 'on_dropfile'
Window.bind(on_dropfile=self.handledrops)
box = BoxLayout(orientation='vertical')
top_label = Label(text='Data manipulation', font_size=45)
box.add_widget(top_label)
run_button = Button(text='Run', size_hint=(1, 0.5))
run_button.bind(on_press=DropFile.test)
box.add_widget(run_button)
two_buttons = BoxLayout(orientation='horizontal')
dropleft = DropFile(text='Drag & Drop File here')
# dropright = DropFile(text='right')
two_buttons.add_widget(dropleft)
# two_buttons.add_widget(dropright)
box.add_widget(two_buttons)
return box
def handledrops(self, *args):
# this will execute each function from list with arguments from
# Window.on_dropfile
#
# make sure `Window.on_dropfile` works on your system first,
# otherwise the example won't work at all
for func in self.drops:
func(*args)
DropApp().run()
Thanks
You can call test() method at the last line of on_dropfile() e.g.:
def on_dropfile(self, widget, path):
# a function catching a dropped file
# if it's dropped in the widget's area
if self.collide_point(*Window.mouse_pos):
self.text = path
self.test(path)
def test(self, path):
minimum_wage = open(path)
LinesToString = ''
...
or launch already from the existing thing e.g. if you run test() separately from the on_dropfile() function and you won't change self.text property after changing the text:
def on_dropfile(self, widget, path):
# a function catching a dropped file
# if it's dropped in the widget's area
if self.collide_point(*Window.mouse_pos):
self.text = path # path is assigned to self.text <--
def test(self):
minimum_wage = open(self.text) # <-- and you can use it
LinesToString = ''
...
Or at the end of on_dropfile put it into a separate variable and use that in open().
I have modified the pywin package demo that creates a button to excel ribbon bar. Once the button is pressed the selected text is run in command line and the selected text is replaced by output.
There is a problem with registering the program with different clsid-filename combination. I cannot change the clsid and/or the filename of the code. If I create a copy of this file, modify and register it, The COM-object that is run is the original excelAddin.py not my new modified file. I am now missing a step in the COM registration process. What line should I add and where?
from win32com import universal
from win32com.server.exception import COMException
from win32com.client import gencache, DispatchWithEvents
import winerror
import pythoncom
from win32com.client import constants, Dispatch
import sys
import win32traceutil
# Support for COM objects we use.
gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 3, bForDemand=True) # Excel 9
gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 1, bForDemand=True) # Office 9
# The TLB defiining the interfaces we implement
universal.RegisterInterfaces('{AC0714F2-3D04-11D1-AE7D-00A0C90F26F4}', 0, 1, 0, ["_IDTExtensibility2"])
class ButtonEvent:
def OnClick(self, button, cancel):
import win32ui # Possible, but not necessary, to use a Pythonwin GUI
import win32con
import subprocess
app = Dispatch("Word.Application")
cmd = app.Selection
#subprocess.Popen(str(cmd))
cmdP = subprocess.Popen(str(cmd), shell = True, stdout = subprocess.PIPE)
txt = cmdP.stdout.readlines()
output = ''
for line in txt:
output += line
app.Selection.TypeText(output)
#win32ui.MessageBox(txt, "Python Test",win32con.MB_OKCANCEL)
return cancel
class ExcelAddin:
_com_interfaces_ = ['_IDTExtensibility2']
_public_methods_ = []
_reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER
#_reg_clsid_ = ""
_reg_clsid_ = "{C5482ECA-F559-45A0-B078-B2036E6F011A}"
#_reg_clsid_ = "{E44EF798-7FDF-4015-AED6-00234CBBBA77}"
#_reg_clsid_ = "{91A89B71-56C0-4a76-BF1F-CF52E3671740}"
_reg_progid_ = 'Juha.test'#"Python.Test.ExcelAddin2"
_reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy"
def __init__(self):
self.appHostApp = None
def OnConnection(self, application, connectMode, addin, custom):
print "OnConnection", application, connectMode, addin, custom
try:
self.appHostApp = application
cbcMyBar = self.appHostApp.CommandBars.Add(Name="PythonBar",
Position=constants.msoBarTop,
MenuBar=constants.msoBarTypeNormal,
Temporary=True)
btnMyButton = cbcMyBar.Controls.Add(Type=constants.msoControlButton, Parameter="Greetings")
btnMyButton=self.toolbarButton = DispatchWithEvents(btnMyButton, ButtonEvent)
btnMyButton.Style = constants.msoButtonCaption
btnMyButton.BeginGroup = True
btnMyButton.Caption = "&Run..."
btnMyButton.TooltipText = "Runs the selected text in command line"
btnMyButton.Width = "34"
cbcMyBar.Visible = True
except pythoncom.com_error, (hr, msg, exc, arg):
print "The Excel call failed with code %d: %s" % (hr, msg)
if exc is None:
print "There is no extended error information"
else:
wcode, source, text, helpFile, helpId, scode = exc
print "The source of the error is", source
print "The error message is", text
print "More info can be found in %s (id=%d)" % (helpFile, helpId)
def OnDisconnection(self, mode, custom):
print "OnDisconnection"
self.appHostApp.CommandBars("PythonBar").Delete
self.appHostApp=None
def OnAddInsUpdate(self, custom):
print "OnAddInsUpdate", custom
def OnStartupComplete(self, custom):
print "OnStartupComplete", custom
def OnBeginShutdown(self, custom):
print "OnBeginShutdown", custom
def RegisterAddin(klass):
import _winreg
key = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Word\\Addins")
#key = _winreg.CreateKey(_winreg.HKEY_LOCAL_MACHINE, "Software\\Classes\\CLSID")
subkey = _winreg.CreateKey(key, klass._reg_progid_)
_winreg.SetValueEx(subkey, "CommandLineSafe", 0, _winreg.REG_DWORD, 0)
_winreg.SetValueEx(subkey, "LoadBehavior", 0, _winreg.REG_DWORD, 3)
_winreg.SetValueEx(subkey, "Description", 0, _winreg.REG_SZ, "Runs selection in command line and pastes output")
_winreg.SetValueEx(subkey, "FriendlyName", 0, _winreg.REG_SZ, "cmdlineRunner")
def UnregisterAddin(klass):
import _winreg
try:
_winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Word\\Addins\\" + klass._reg_progid_)
except WindowsError:
pass
if __name__ == '__main__':
import win32com.server.register
win32com.server.register.UseCommandLine(ExcelAddin)
if "--unregister" in sys.argv:
UnregisterAddin(ExcelAddin)
else:
RegisterAddin(ExcelAddin)