Tkinter why cant copy text from textbox? - python

so i made a program that can convert pdf file to text bu then I make it into a gui so that its easier for a user but when it work I wasn't able to copy the text from the text box is there something wrong with my code or did I do something wrong pls help
import PyPDF2
import tkinter as tk
from tkinter import filedialog
from tkinter import *
def browseFiles():
file = filedialog.askopenfilename(initialdir = "/",title = "Select a Pdf File", filetypes = (("PDF files","*.pdf"),("all files","*.*")))
print(file)
return file
#Graphical User Interface
root = tk.Tk()
root.title('Pdf to text')
root.geometry('600x400')
#Upload pdf
tLabel = tk.Label(root, text='PDF to Text Converter')
tLabel.pack()
textFile = tk.Text(root, height=20, width=70)
textFile.config(bg='#dddddd')
textFile.pack()
button_explore = Button(root,
text = "Browse Files",
command = browseFiles,)
button_explore.pack()
button_exit = Button(root,
text = " Exit ",
command = exit)
button_exit.pack()
file = browseFiles()
pdfFileObj = open(file, "rb")
# create reader variable that will read the pdffileobj
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
# This will store the number of pages of this pdf file
x = pdfReader.numPages
# create variable that will select the selected number of pages
# x+1 because python indentation start from 0
pageObj = pdfReader.getPage(x - 1)
# create text variable which will store all text data from pdf file
textObj = pageObj.extractText()
textFile.config(state='normal')
textFile.delete('1.0', 'end')
textFile.insert('1.0', textObj)
textFile.config(state='disabled')
root.mainloop()

Related

button change its text to the file name

How do I force the button to change its text to the filename? Everything works fine, a dialog box opens and files open too. But I still can't change the button name to the file name and save it.
Here is the code:
import tkinter.filedialog as tfd
import tkinter as tk
import os
window = tk.Tk()
window.title("Op")
window.geometry("600x400")
window.resizable(False, False)
file_name = ""
def open():
global file_name
file_name = tfd.askopenfilename()
os.startfile(file_name) #open file
btn1 = tk.Button(window, text=f"Open {file_name}", command=open) #button
btn1.place(x = 20, y = 25)
You can set the buttons text property using.
button['text'] = fileName
You can also read the button text propeerty to make sure it has been set to the file name in code, I.e. with an if statement.
bText = button['text']
Try using .config -
import tkinter.filedialog as tfd
import tkinter as tk
import os
window = tk.Tk()
window.title("Op")
window.geometry("600x400")
window.resizable(False, False)
file_name = ""
def open():
global file_name
file_name = tfd.askopenfilename()
btn1.config(text=file_name) # Configure the button's text
os.startfile(file_name) #open file
btn1 = tk.Button(window, text=f"Open {file_name}", command=open) #button
btn1.place(x = 20, y = 25)
But if you run this code, the button name gets changed to the complete pathname (e.g. - C:/.../Choosen.file), so if you want only the file name ('Choosen.file') then use this -
btn1.config(text=file_name.split('/')[-1])
You can use:
window = tk.Tk()
window.title("Op")
window.geometry("600x400")
window.resizable(False, False)
file_name = ""
def open():
global file_name
file_name = tfd.askopenfilename()
btn1["text"] += " '" + file_name + "'"
os.startfile(file_name)
btn1 = tk.Button(window, text="Open file", command=open) # button
btn1.place(x=20, y=25)
tk.mainloop()
This uses the old text of the button and appends '{file_path}' to it -> Open file '{file_path}'
You could define a new class that maintains state. This way you can avoid the global, and will be able to make multiple buttons each with their own files.
class FileButton(tk.Button):
def __init__(self, window, file_name=""):
super().__init__(window, command=self.open)
self.set_text(file_name)
def set_text(self, file_name):
self.file_name = file_name
self["text"] = f"Open {self.file_name}"
def open(self):
if self.file_name == "":
self.set_text(tfd.askopenfilename())
os.startfile(self.file_name)
window = tk.Tk()
window.title("Op")
window.geometry("600x400")
window.resizable(False, False)
btn1 = FileButton(window)
btn1.place(x=20, y=25)
window.mainloop()

Open file and get file path

I'm trying to create a button to browse file and copy that file to a Master file and my code as below:
from tkinter import *
from tkinter import filedialog
def get_file_path():
global file_path
file_path= filedialog.askopenfilename(title = "Select A File", filetypes = (("xlsx", "*.xlsx"), ("xls", "*.xls"), ("xlsm", "*.xlsm"), ("All Files", "*.*")))
l1 = Label(window, text = file_path).pack()
window = Tk()
b1 = Button(window, text = "Open File", command = get_file_path).pack()
window.mainloop()
def close_window():
window.destroy()
print(file_path)
import openpyxl as xl
path1 = ("r'" and file_path)
path2 = (r'C:\Users\...\Write_Data.xlsx')
wb1 = xl.load_workbook(filename=path1)
ws1 = wb1["BASEL_LN_CTR"]
wb2 = xl.load_workbook(filename=path2)
ws2 = wb2["Loan Data"]
for row in ws1:
for cell in row:
ws2[cell.coordinate].value = cell.value
wb2.save(path2)
Everything is working well for me but I have to close window manually to print file_path. I would like to know that there is any way to close window aucomatically. I used destroy() but it not worked.
You created close_window() but you never use it.
You could create another button to run it (or to run directly window.destroy)
window = tk.Tk()
b1 = tk.Button(window, text="Open File", command=get_file_path).pack()
b2 = tk.Button(window, text="Close", comman=window.destroy).pack()
window.mainloop()
Or you should run it directly in get_file_path()
def get_file_path():
global file_path
file_path = filedialog.askopenfilename(title="Select A File", filetypes = (("xlsx", "*.xlsx"), ("xls", "*.xls"), ("xlsm", "*.xlsm"), ("All Files", "*.*")))
if file_path: # empty when pressed `Cancel`
#tk.Label(window, text=file_path).pack()
window.destroy()

can't insert default text into TKinter

So I am creating a text editor using TKinter. I have the basics down and now I am trying to create a button where when you press it, you select a file and it opens it. From what I have seen the insert method would be best for Entry widget. But i am using Label widget and it does not work for some reason. Here is my code so far:
import sys
import tkinter as tk
frame = tk.Tk()
frame.title("Fake Google Docs")
frame.geometry('800x600')
inputtxt = tk.Text(frame,
height = 25,
width = 90)
inputtxt.pack()
global file
#this is function to be executed when u press first button
def printInput():
filename = input("Name of the file make sure you end with .txt")
file = open(filename, 'w')
result=inputtxt.get("1.0","end")
file.write(result)
file.close()
#this is function to be executed for open new file thing
def printInputnew():
filenamemm = input("Name of the file make sure you end with .txt")
file = open(filenamemm, 'w')
result=inputtxt.get("1.0","end")
file.write("")
file.close()
def openfile():
filenamem = input("Name of the file you want to open")
tru=open(filenamem)
if tru== False:
sys.exit()
else:
f = open(filenamem, "r")
for x in f:
print(x)
name=str(x)
text = tk.StringVar()
text.set(name)
#button 1
printButton = tk.Button(frame,
text = "Save to text file",
command = printInput)
printButton.pack()
printButtonl = tk.Button(frame,
text = "open a file",
command = openfile)
printButtonl.pack()
#button 2
printButton = tk.Button(frame,
text = "Open new file",
command = printInputnew)
printButton.pack()
#open the text box
lbl = tk.Label(frame, textvariable = "")
lbl.pack()
#finish code
frame.mainloop()
Could someone else suggest a method for inserting text into this widget?
Here it is:
import sys
import tkinter as tk
from tkinter import filedialog
frame = tk.Tk()
frame.title("Fake Google Docs")
frame.geometry('800x600')
inputtxt = tk.Text(frame,
height=25,
width=90)
inputtxt.pack()
global file
mask = [("Text and Python files", "*.txt *.py *.pyw *.rcad"),
("HTML files", "*.htm"),
("All files", "*.*")]
# this is function to be executed when u press first button
def printInput():
filename = input("Name of the file make sure you end with .txt")
file = open(filename, 'w')
result = inputtxt.get("1.0", "end")
file.write(result)
file.close()
# this is function to be executed for open new file thing
def printInputnew():
filenamemm = input("Name of the file make sure you end with .txt")
file = open(filenamemm, 'w')
result = inputtxt.get("1.0", "end")
file.write("")
file.close()
def openfile():
filenamem = filedialog.askopenfilename(filetypes=mask)
tru = open(filenamem)
if tru == False:
sys.exit()
else:
f = open(filenamem, "r")
inputtxt.delete(0.0, 'end')
inputtxt.insert('end', f.read())
# button 1
printButton = tk.Button(frame,
text="Save to text file",
command=printInput)
printButton.pack()
printButtonl = tk.Button(frame,
text="open a file",
command=openfile)
printButtonl.pack()
# button 2
printButton = tk.Button(frame,
text="Open new file",
command=printInputnew)
printButton.pack()
# open the text box
lbl = tk.Label(frame, textvariable="")
lbl.pack()
# finish code
frame.mainloop()
I changed this block of code:
def openfile():
filenamem = filedialog.askopenfilename(filetypes=mask)
tru = open(filenamem)
if tru == False:
sys.exit()
else:
f = open(filenamem, "r")
inputtxt.delete(0.0, 'end')
inputtxt.insert('end', f.read())
It opens a window that ask you which file you want to open. askopenfilename method returns a string path to selected file. Then you just read whole file, delete whole text that you had in your tk.Text object and paste there text from opened file. That is all :)
And please, next time watch some guides about tkinter before asking and read about PEP8.

How do I assign an input from one python script to be an input in another script as well

I currently have two different python scripts. The first one converts parquet files to xlsx and the second is really just trying to build a gui to be able to run the first script.**
Here is the first script:
import pandas as pd
import os
import pyarrow
import shutil
from pathlib import Path
file = input("What file would you like to convert from parquet to csv? ")
df1 = pd.read_parquet(file)
df = df1.append(df1, ignore_index=True)
dirout = input("Where would you like the xlsx file to be output to?")
name = input("What would you like to call the ouput file?" )
cfile = os.path.join(dirout, name + "." + "xlsx")
df.to_excel(cfile)
In this second script I would like the user to input txt that would feed file, name and dirout. Is that possible?
import os
from tkinter import *
window = Tk()
window.title("Convertor")
#Sets the size of the window
window.geometry('550x400')
#Adds a header to the window and configures the size
lbl = Label(window, text="Convert Parquet to CSV", font=("Arial Bold", 18))
#Configures where the label message will appear
lbl.grid(column=0, row=0)
#adds an input text message
txt = Entry(window,width = 30)
txt.grid(column=3, row=3)
txt = Entry(window,width = 30)
txt.grid(column=4, row=4)
def clicked():
os.system('python ParquetToCsv.py')
#Adding a button
btn = Button(window, text="Convert", command=clicked)
btn.grid(column=6, row = 6)
#The mainloop causes the window to remain open until someone interacts with it
window.mainloop()
Turn your first script into a function with arguments for the variables you want to pass:
def myfunc(f, n, dir):
file = f
df1 = pd.read_parquet(file)
df = df1.append(df1, ignore_index=True)
dirout = dir
name = n
cfile = os.path.join(dirout, name + "." + "xlsx")
df.to_excel(cfile)
Then import the function into the other script and call it passing the arguments:
import os
from tkinter import *
from myutils import myfunc
window = Tk()
window.title("Convertor")
#Sets the size of the window
window.geometry('550x400')
#Adds a header to the window and configures the size
lbl = Label(window, text="Convert Parquet to CSV", font=("Arial Bold", 18))
#Configures where the label message will appear
lbl.grid(column=0, row=0)
#adds an input text message
txt_name = Entry(window,width = 30)
txt.grid(column=3, row=3)
txt_file = Entry(window,width = 30)
txt.grid(column=4, row=4)
txt_dir = Entry(window,width = 30)
txt.grid(column=4, row=4)
def clicked():
os.system('python ParquetToCsv.py')
#Adding a button
btn = Button(window, text="Convert", command=clicked)
btn.grid(column=6, row = 6)
#The mainloop causes the window to remain open until someone interacts with it
window.mainloop()
# Call function passing the arguments
myfunc(txt_file, txt_name, txt_dir)

How to get value from command tkinter

This is probably a newbie question but I'm having issues figuring out how to get a value from a function, to be used as input in another.
I would also like to have some tips about code organization.
In this example I'm trying to get the filePath and outPut Folder path to be used in the function processFile.
Thank you
Code:
from tkinter import *
from tkinter import ttk
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import askdirectory
import PyPDF2
from PyPDF2 import PdfFileWriter, PdfFileReader
version = "v0.0.01"
root = Tk()
def window (main):
main.title("File Opener " + version)
width = main.winfo_width()
main.geometry('500x200')
numero = str(1)
def OpenFile():
fileName = askopenfilename(initialdir="C:/",
filetypes =(("PDF File", "*.pdf"),("All Files","*.*")),
title = "Select PDF File",
)
labelName = Label(text="File Path: " + fileName)
labelName.pack()
print(fileName)
return fileName
def outputFolder(): #Bug, label keeps adding paths
outPath = askdirectory()
labelName2 = Label(text="Output Folder: " + outPath)
labelName2.pack()
print(outPath)
return outPath
def processFile(inFile,outFolder):
''' print(fileName) get input name and output variables
print(outPath)'''
label = ttk.Label(root, text ="",foreground="black",font=("Helvetica", 16))
label.pack()
#Button Open-----------
button1 = Button (text = "Open File", command = OpenFile)
button1.pack()
#Button Start---------
buttonStart = Button (text = "Start Process", command = processFile)#give as parameter inputFile and link
buttonStart.place(height=50, width=100)
#Button Open-----------
button3 = Button (text = "Output Folder", command = outputFolder)
button3.pack()
#Menu Bar ----------------
menu = Menu(root)
root.config(menu=menu)
file = Menu(menu)
file.add_command(label = 'Open', command = OpenFile)
file.add_command(label = 'Exit', command = lambda:exit())
menu.add_cascade(label = 'File', menu = file)
window(root)
root.mainloop()
If you use the function in a variable the returned result from the function is stored in the variable.
def Function1(x):
return x*2
var1 = Function1(5)
Then var1 = 10.
But about your buttons, do you want to take input from the user that will be saved when the button is pressed or do you want the button to send a set value?
from tkinter import *
from tkinter import ttk
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import askdirectory
import PyPDF2
from PyPDF2 import PdfFileWriter, PdfFileReader
version = "v0.0.01"
root = Tk()
def window (main):
main.title("File Opener " + version)
width = main.winfo_width()
main.geometry('500x200')
main.configure(background = 'black')
numero = str(1)
#openFile
def OpenFile():
global fileName
fileName = askopenfilename(initialdir="C:/",
filetypes =(("PDF File", "*.pdf"),("All Files","*.*")),
title = "Select PDF File",
)
labelName = Label(text="File Path: " + fileName)
labelName.pack()
print(fileName)
return str(fileName)
#getOutputPath
def outputFolder(): #Bug, label keeps adding paths
outPath = askdirectory()
labelName2 = Label(text="Output Folder: " + outPath)
labelName2.pack()
print(outPath)
return outPath
#testFunct
def printFilename(inArg):
print(inArg)
x = OpenFile()
print (OpenFile())
lambda: printFilename(fileName)
#processRealDeal
def processFile(): #THIS IS THE MAIN FUNC
''' print(fileName) get input name and output variables
print(outPath)'''
print (OpenFile)
label = ttk.Label(root, text ="",foreground="black",font=("Helvetica", 16))
label.pack()
#Button Open-----------
button1 = Button (text = "Open File", command = OpenFile)
button1.pack()
#Button Start---------
buttonStart = Button (text = "Start Process", command = lambda: printFilename("Hello World!!!"))#give as parameter inputFile and link
buttonStart.place(height=50, width=100)
#Button Open-----------
button3 = Button (text = "Output Folder", command = outputFolder)
button3.pack()
#Menu Bar ----------------
menu = Menu(root)
root.config(menu=menu)
file = Menu(menu)
file.add_command(label = 'Open', command = OpenFile)
file.add_command(label = 'Exit', command = lambda:exit())
menu.add_cascade(label = 'File', menu = file)
window(root)
root.mainloop()
I cant see that you have declared the global fileName variabel outside the function.
I did this
from tkinter import *
from tkinter import ttk
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import askdirectory
import PyPDF2
from PyPDF2 import PdfFileWriter, PdfFileReader
version = "v0.0.01"
root = Tk()
fileName = "test"
def window (main):
main.title("File Opener " + version)
width = main.winfo_width()
main.geometry('500x200')
main.configure(background = 'black')
numero = str(1)
#openFile
def OpenFile():
global fileName
fileName = askopenfilename(initialdir="C:/",
filetypes =(("PDF File", "*.pdf"),("All Files","*.*")),
title = "Select PDF File",
)
labelName = Label(text="File Path: " + fileName)
labelName.pack()
test()
return str(fileName)
#getOutputPath
def test():
print(fileName)
def outputFolder(): #Bug, label keeps adding paths
outPath = askdirectory()
labelName2 = Label(text="Output Folder: " + outPath)
labelName2.pack()
print(outPath)
return outPath
#testFunct
def printFilename(inArg):
print(inArg)
x = OpenFile()
print (OpenFile())
lambda: printFilename(fileName)
#processRealDeal
def processFile(): #THIS IS THE MAIN FUNC
''' print(fileName) get input name and output variables
print(outPath)'''
print (OpenFile)
label = ttk.Label(root, text ="",foreground="black",font=("Helvetica", 16))
label.pack()
#Button Open-----------
button1 = Button (text = "Open File", command = OpenFile)
button1.pack()
#Button Start---------
buttonStart = Button (text = "Start Process", command = lambda: printFilename("Hello World!!!"))#give as parameter inputFile and link
buttonStart.place(height=50, width=100)
#Button Open-----------
button3 = Button (text = "Output Folder", command = outputFolder)
button3.pack()
#Menu Bar ----------------
menu = Menu(root)
root.config(menu=menu)
file = Menu(menu)
file.add_command(label = 'Open', command = OpenFile)
file.add_command(label = 'Exit', command = lambda:exit())
menu.add_cascade(label = 'File', menu = file)
window(root)
root.mainloop()
And the test function prints the chosen file. So the global variable is now containing the correct value.
So just declare it at the top and you will be able to retrieve the value

Categories