i have a problem in my code in python (tkinter)
I have two files (F1.py) and (F2.py), each of which is a window, and I have another file called (main.py) that opens a window with two buttons, I want to click one of the (F1) files every time Or (F2) open.
What should I do ?
this is my code:
from tkinter import *
main = Tk()
def f1():
import f1.py
# I do not know what to do to run the file f1.py here !!
def f2():
import f2.py
# I do not know what to do to run the file f2.py here !!
btn_f2 = Button(main,text="open f2",command=f2).pack()
btn_f1 = Button(main,text="open f1",command=f1).pack()
mainloop()
Here is the work around according to your need, Since you want to execute your other tkinter window from your main python script. Here is the way to do that.
in your main.py
from tkinter import *
import os
import sys
import f1,f2
main= Tk()
def open(filename):
os.chdir("D:\\PYTHON_FILES\\") #change this path to your path where your f1.py and f2.py is located
# print("current dir "+os.getcwd())
os.system('python '+filename) #runnning the python command on cmd to execute both windows
btn_f2 = Button(main,text="open f2",command=lambda: open("f1.py")).pack()
btn_f1 = Button(main,text="open f1",command=lambda: open("f2.py")).pack()
main.mainloop()
Now define f1.py for example
from tkinter import *
window= Tk()
window.title('f1 Hello Python')
window.geometry("300x200+10+10")
mainloop()
Similarly for example we have f2.py
from tkinter import *
window= Tk()
window.title('f2 Hello Python')
window.geometry("300x200+10+10")
mainloop()
Now If you want to go for the legit way using TopLevel in Tinkter as #Matiis Described then here is clean and perfect way to achieve the goal.
Simply make a main.py as below
from tkinter import *
root = Tk()
root.geometry("200x200")
#here define your f1 window
def f1():
top = Toplevel(root)
top.geometry("400x400")
top.title("I am f1 window smaller than f2 but bigger than root")
top.mainloop()
#Similarly here define your f2 window
def f2():
top = Toplevel(root)
top.geometry("500x500")
top.title("I am f2 window bigger than f1")
top.mainloop()
btn1 = Button(root, text = "open f1", command = f1)
btn2 = Button(root, text = "open f2", command = f2)
btn1.place(x=75,y=50)
btn2.place(x=75,y=20)
root.mainloop()
I might be a little late with this, but I've recently started learning python and I had the same issue with tkinter. I had a "main.py" file and I wanted it to open "f1.py" by clicking a button.
I realized that when you configure a button in tkinter you have to assign a function so I wrote "main.py" as a regular pyhon/tkinter file importing f1.py:
from tkinter import *
from tkinter import ttk
import f1
main = Tk()
main.title("Main window")
but = Button(main, text="Open f1.py", command= f1.f1_func)
but.pack()
main.mainloop()
And instead of defining the function on the main file (def but_openwindow(): etc...) I wrote that function on the "f1.py" but JUST as a function, not as a mainloop. So the f1.py would be something like this:
from tkinter import *
from tkinter import ttk
def f1_func():
other = Toplevel()
other.title("Other window")
text = Label(other, text="This is another window")
text.pack()
And you could repeat it for any number of other .py files. So far I found out 2 important things:
1- I thought it wouldn't be necessary, but apparently you have to start f1.py importing tkinter libraries, otherwise it wouldn"t work. At least for me it didn't.
2- The files that you want to import can't have a "mainloop" or it just opens the other window as soon as you execute the main file.
I have yet to try to make an .exe of the main file, but I'm hoping to get there.
Sorry again for being late, hope it helps, if not for you, at leas for anyone else that might encounter this same problem.
Related
I have a simple application in python. When I click a button it should open up the same file multiple times. However, after two times the program won't open any more windows.
Here is my code so far for file1:
from tkinter import *
root = Tk()
root.geometry("600x600")
def newWin():
import file1
button = Button(root, text="Open Window of same file", command=newWin)
button.pack()
root.mainloop()
After clicking the button one time, it opens up the same file in a new window, but when I click the button in that window, it doesn't work. How do I fix this?
import file1 will only import file1 and execute the code inside file1 once. When import file1 is called again, nothing will happen because file1 has already been imported.
To get around this, you can put the code inside a function and call that function after importing file1:
# file1.py
import tkinter as tk
def main():
root = tk.Tk()
root.geometry('600x600')
def new_win():
import file1
file1.main()
button = tk.Button(root, text='Open Window of same file', command=new_win)
button.pack()
root.mainloop()
if __name__ == '__main__':
main()
However, importing file1 inside file1 is not a good practice and should be avoided.
The above code is just a demo of fixing the import issue. Actually you don't need to call import file1 inside file1, just call main():
# file1.py
import tkinter as tk
def main():
root = tk.Tk()
root.geometry('600x600')
button = tk.Button(root, text='Open Window of same file', command=main)
button.pack()
root.mainloop()
if __name__ == '__main__':
main()
Your button has no command parameter, otherwise, it will do nothing.
button = Button(root, text="Open Window of same file", command = newWin)
Also, change add the .py extension while importing your file:
import file1.py
I'm trying to make a launcher for another program but I just started with Python so I made a button, but I struggle to figure out how to execute another .py file. Any help?
When the button is pressed it activates the open_file() function and os opens the .py script.
from tkinter import *
import os
def open_file():
os.system('python file path here')
root=Tk()
btn = Button(root, text='Open .PY File', command=open_file)
btn.pack()
root.mainloop()
Here is a solution using from subprocess import call. All you have to do is replace 'YOUR_FILE_NAME' with... your file name :D
from tkinter import *
from subprocess import call
root=Tk()
root.geometry('200x100')
frame = Frame(root)
frame.pack(pady=20,padx=20)
def Open():
call(["python", "YOUR-FILE-NAME.py"])
btn=Button(frame,text='Open File',command=Open)
btn.pack()
root.mainloop()
What it will look like:
I hope this works for you :D
I am building a program for Windows PCs that contains a lot of buttons and seems very plain. So I was wondering, can I make it so when you push a button (using tkinter), can I play a sound to liven up the program a bit? Please keep in mind I am learning so please dumb it down a bit.
Assuming your file is a WAV:
from tkinter import *
from winsound import *
root = Tk() # create tkinter window
play = lambda: PlaySound('Sound.wav', SND_FILENAME)
button = Button(root, text = 'Play', command = play)
button.pack()
root.mainloop()
Assuming your file is a MP3:
from Tkinter import *
import mp3play
root = Tk() # create tkinter window
f = mp3play.load('Sound.mp3'); play = lambda: f.play()
button = Button(root, text = 'Play', command = play)
button.pack()
root.mainloop()
You might want to consider using pygame as a cross-platform alternative to winsound.
import tkinter as tk
from pygame import mixer
mixer.init()
sound = mixer.Sound("sound.ogg")
root = tk.Tk()
tk.Button(root, command=sound.play).pack()
root.mainloop()
Refer to the docs for more information.
You first need to link the click of your mouse on the image, with an even handler, then simply define an on_click function:
def on_click(event):
winsound.Beep('frequency', 'duration')
Here you can find more information about playing sounds in python.
Just use
import os
os.system("play sound.mp3")
trying to make a GUI with an 'open file' button. When I run the code shown below, the open file dialog opens straight away, and not when I press the button. Why? Is there a simple way to fix this that doesn't involve using classes? (I don't currently know anything about classes and am working on a time-pressured project)
from tkinter import *
interface = Tk()
def openfile():
return filedialog.askopenfilename()
button = ttk.Button(interface, text = "Open", command = openfile())
button.grid(column = 1, row = 1)
interface.mainloop()
The code is passing the return value of the openfile function call, not the function itself. Pass the function itself by removing trailing () which cause a call.
from tkinter import *
from tkinter import ttk
from tkinter import filedialog
interface = Tk()
def openfile():
return filedialog.askopenfilename()
button = ttk.Button(interface, text="Open", command=openfile) # <------
button.grid(column=1, row=1)
interface.mainloop()
I'm trying to make a launcher for my Python program with Tkinter. I used the execfile function, and fortunately it opened the target GUI. However, none of the buttons would work, and it would say the global variable most functions reference isn't defined.
The code to launch the program:
def launch():
execfile("gui.py")
That works. The base code for the target program:
from Tkinter import *
gui = Tk()
gui.title("This is a GUI")
EDIT:
Example of a button:
def buttonWin():
buttonWindow = Toplevel(gui)
button = Button(buttonWindow, text = "Button", width = 10, command = None)
button.pack()
When it references that 'gui' variable for Toplevel, it comes up with an error. I tried defining the 'gui' variable in the Launcher script, but that only caused the target script to open first, instead of the Launcher:
gui = Tk()
launcher = Tk()
launcher.title("Launcher")
def launch():
return execfile("gui.py")
launchButton = Button(launcher, text = "Launch", width = 10, command = launch)
When I try pressing one of this program's buttons, I get a NameError:
$NameError: Global variable 'gui' is not defined$
Also this is in Python 2.7.5.
Thank you anyone who answers, and sorry for any errors with the code blocks; I'm new.
The problem is that you have structured the Tkinter program incorrectly.
In "gui.py" you should have something like:
from Tkinter import *
gui= Tk()
gui.mainloop()
You can add buttons to perform functions and customize it:
from Tkinter import *
gui = Tk()
gui.title("This is a GUI")
def launch():
execfile("gui.py")
launchbutton = Button(gui, text='Launch Program', command=launch)
launchbutton.pack()
gui.mainloop()
I think with your function buttonWin you were trying to do what is normally handled by a class; see unutbu's answer here.
I'm not sure if I've addressed your problem, but this should be a start.