Not able to get Tkinter Values outside of class - python

I have created a simple tKinter Gui with PAGE builder and I am able to click a button and execute the corresponding command function within it. But when I try to get a value of a specific text box within the function I get various errors mostly no such property found. I have tried adding self and the class name into the property and even passing the property from the class as well as making it a function within that class but I still can't seem to access the values of the textbox 'Username'. I would really appreciate any help on how to get those text box values within the function as I have been researching for hours but still cannot make it work. Also if anyone knows of any good tutorial on this topic would help tremendously. Thank you.
The project has 2 files: (I've tried to remove the non essential code)
MacUpdaterPageDesign.py
import sys
import tkinter as tk
import tkinter.ttk as ttk
from tkinter.constants import *
import os.path
_script = sys.argv[0]
_location = os.path.dirname(_script)
import MacUpdaterPageDesign_support
class Toplevel1:
def __init__(self, top=None):
top.title("Mac Updater")
top.configure(background="#d9d9d9")
self.top = top
self.MainFrame = tk.Frame(self.top)
self.MainFrame.place(relx=0.0, rely=0.18, relheight=0.811
, relwidth=1.099)
self.Username = tk.Text(self.MainFrame)
self.Username.place(relx=0.15, rely=0.081, relheight=0.048
, relwidth=0.279)
#this button calls the CopyMACfunc on the support page
self.CopyMAC = tk.Button(self.MainFrame)
self.CopyMAC.place(relx=0.143, rely=0.846, height=34, width=117)
self.CopyMAC.configure(command=MacUpdaterPageDesign_support.CopyMACfunc)
self.CopyMAC.configure(text='Copy MAC')
MacUpdaterPageDesign_support.py
import sys
import tkinter as tk
import tkinter.ttk as ttk
from tkinter.constants import *
import MacUpdaterPageDesign
def main(*args):
'''Main entry point for the application.'''
global root
root = tk.Tk()
root.protocol( 'WM_DELETE_WINDOW' , root.destroy)
# Creates a toplevel widget.
global _top1, _w1
_top1 = root
_w1 = MacUpdaterPageDesign.Toplevel1(_top1)
root.mainloop()
def CopyMACfunc(*args):
#this part must retrieve the value in from Username
#tried many variations of below but throws error
username = MacUpdaterPageDesign.Username.get("1.0",END)
print(username)
if __name__ == '__main__':
MacUpdaterPageDesign.start_up()

Actually while writing this question I finally got it to work:
username = _w1.Username.get("1.0",END)
it did work with the following but not sure if this would be the right way to do it per say. Maybe their are better ways if anyone knows. Also would appreciate any recommendation for a good tutorial or where to learn all of this type of info. Thanks

Related

Why do I get an error when I leave out "from tkinter import *"?

In the following code I get an error when leaving out "from tkinter import *. I am confused as to the reason as I import tkinter as tk.
I tried modifying the function set_text without success.
The error is on
self.e.delete(0,END)
NameError: name 'END' is not defined`
Code:
from tkinter import *
import tkinter as tk
from tkinter import ttk
class HelperFun():
def set_text(self,parent,text):
self.e.delete(0,END)
self.e.insert(0,text)
return
def __init__(self,parent):
self.parent=parent
self.e = tk.Entry(self.parent,width=10)
self.e.pack()
self.b1 = tk.Button(self.parent,text="animal",
command=lambda:self.set_text(self.parent,"animal"))
...
root=tk.Tk()
HelperFun(root)
root.mainloop()
Thank you.
When you use, from Tkinter import *, it imports all of the constants from that package, like END.
To get away without using this, you'd need to use the dot operator, like tk.END, otherwise it won't be defined.
If you import tkinter as tk then you need to refer to END as tk.END.
Importing from tkinter import * imports everything in tkinter, making it so you don't have to use the tk qualifying prefix.
replace the line
self.e.delete(0,END)
with
self.e.delete(0,"end")
Your code isn't doing anything. And it is not showing Button
You cannot use self.e simultaneously in the set text() function.
The Button command isn't right.
I modified the code to make it more readability:
import tkinter as tk
class HelperFun():
def __init__(self, parent):
self.parent=parent
self.e = tk.Entry(self.parent,width=10)
self.e.pack()
self.b1 = tk.Button(self.parent,text="animal",
command=lambda:self.set_text(self.e.get()))
self.b1.pack()
self.lb = tk.Label(self.parent, width=10)
self.lb.pack()
def set_text(self, _text):
print(_text)
self.lb.configure(text=_text)
return
root=tk.Tk()
app = HelperFun(root)
root.mainloop()
Screenshot before and after clicking button:
I think in "(0,END)" you need to use 1.0 instead of 0.
Try "(1.0,END)"
END is like Button and Label ...
u have to write tk.END if u (import tkinter as tk)

Unable to use autocomplete for combobox Python

I'm trying to include Autocomplete in my combobox but it's not working. Received an error when I'm trying to use tkentrycomplete. Below is the code I'm using for combobox, please point out my mistakes and help me out. Thank you
from tkinter import *
from tkinter.ttk import *
from tkinter import ttk
import tkinter as tk
import pandas as pd
comboExample1 = ttk.Combobox(window, width=30, values=list(df3["MFG Device"].unique()))
# comboExample1.current(0)
val = tk.StringVar()
comboExample1 = tkentrycomplete.AutocompleteCombobox(textvariable=val)
comboExample1.place(x=90, y=70)
comboExample1.bind("<<ComboboxSelected>>", select_device)
Error:
comboExample1 = tkentrycomplete.AutocompleteCombobox(textvariable=val)
NameError: name 'tkentrycomplete' is not define
tkentrycomplete is not a thing, I think what you need to do is comboExample1.AutocompleteCombobox(textvariable=val)
(I put this as an answer since I don't have enough rep to comment)
Edit:
try this:
comboExample1['values'] = val
(you may need to put this into a function and then bind it)

Why there is a problem while displaying image from different a GUI in different module by making call to the function from another module?

I tried to make a module in which I made a funtion which just reads and display the image in GUI. Then I made another module which makes call to that function when the button is clicked. Button gives me error.
#module code:
from tkinter import *
class disp:
def __init__(self):
root1.geometry("400x500")
image = PhotoImage(file = 'png2.png')
Label(root1,image=image).pack()
root1.mainloop()
#main code:
from tkinter import *
import testimg as ti
def click():
ti.disp()
root = Tk()
Button(text = 'Click me',command=click).pack()
root.mainloop()
In your class disp, you have put the master as root1 whereas in the main code, you have defined Tk() as root. This means that root1 is no window so the label that has a master of root1 has no where to pack itself.
You also need to remove root1.mainloop() because it’s useless and causing errors due to the fact that root1 doesn’t have Tk(). It’s like trying to loop a while statement without typing in while. This gives an error.
Below modified code is based on yours:
#module code:
from tkinter import *
class disp:
def __init__(self):
root1 = Tk()
root1.geometry("400x500")
image = PhotoImage(master=root1, file='png2.png') # set master to root1
Label(root1, image=image).pack()
root1.mainloop()
But using multiple Tk() instances is not a good design.

tkinter askdirectory doesn't work from imported module

I have been using tkinter to supply a file dialog (in python 3.6) which allows users to select a directory. It works fine when it is a sub-function within the same module, but if I move that subfunction into a separate module and then try to import it from that module, it no longer works. Instead the code just hangs when the file dialog should pop up but it never appears.
working code:
This works if I run the main function
from tkinter import Tk
from tkinter.filedialog import askdirectory
def SelectDirectory():
# start up the tk stuff to have a file directory popup
print('start')
root = Tk()
print('postroot')
root.withdraw()
print('postwithdraw')
# let the user pick a folder
basepath = askdirectory(title='Please select a folder')
print('postselection')
root.destroy()
print('postdestroy')
return basepath
def main():
ans = SelectDirectory()
print(ans)
If I instead put this in another module and import it from that module, then it will print until 'postwithdraw' and then just hang.
submod.py:
from tkinter import Tk
from tkinter.filedialog import askdirectory
def SelectDirectory():
# start up the tk stuff to have a file directory popup
print('start')
root = Tk()
print('postroot')
root.withdraw()
print('postwithdraw')
# let the user pick a folder
basepath = askdirectory(title='Please select a folder')
print('postselection')
root.destroy()
print('postdestroy')
return basepath
and then run this:
from submod import SelectDirectory
def main():
ans = SelectDirectory()
print(ans)
It never gets past 'postwithdraw' and the file dialog never pops up.
Does anyone know what I am doing wrong here? I would think it has something to do with the tkinter window not appearing since its not the main module but is there some way to get past that?
Your both versions don't work. Both give 'module' object is not callable.
You have to use
root = Tk.Tk()
instead of
root = Tk()
and then both versions works.
Maybe two Tk in Tk.Tk() seems weird but usually we use lowercase tk instead of Tk in
import tkinter as tk
and then you have
root = tk.Tk()

problems with the update of a label Tkinter

I'm really stuck on a basilary things: I have this code
from tkinter import *
import sys
import subprocess
import tkinter as tk
def cd():
f=(subprocess.check_output("net view"))
e=(f.decode(sys.stdout.encoding))
label1=Label(text=e).pack()
def mainscreen():
mainscreen=Tk()
mainscreen.title("Terfysgol's kit V 2.0")
frame1=Frame(mainscreen)
frame1.pack()
puls1=Button(frame1,text="List of device", borderwidth= "2",command= cd).pack()
mainscreen()
When I run it all the time that I press the button it create a new label but I only want to update the text of the label1.
This is what you are after:
def cd():
f=(subprocess.check_output("net view"))
e=(f.decode(sys.stdout.encoding))
label1.config(text = e)
and then at the top of your program after your imports you need to put:
label1 = Label()
label1.pack()
Please note that I'm not suggesting this is good program structure, but that is up to you to sort out. This answer is just a quick fix to provide you with enough information to work out the rest of what you need.
Also you can remove the import tkinter as tk line already imports tkinter.

Categories

Resources