看起来python是局部的

看起来python是局部的,python,Python,下面是我创建的一个函数,并将其放入名为last_function.py的文件中 from tkinter import* def new_gui(app,sound_file,mixer): track=mixer.Sound(sound_file) def track_toggle(): if ballCheckbutton.get()==1: track.play(loops=-1) else:

下面是我创建的一个函数,并将其放入名为last_function.py的文件中

from tkinter import*


def new_gui(app,sound_file,mixer):

    track=mixer.Sound(sound_file)
    def track_toggle():
        if ballCheckbutton.get()==1:

            track.play(loops=-1)
        else:
            track.stop()

    ballCheckbutton=IntVar()    
    c1=Checkbutton(app,text="check me out",command=track_toggle,variable=ballCheckbutton)
    c1.pack(side=LEFT)

    ballScale=DoubleVar()

    def ScaleVolume(v):
        track.set_volume(ballScale.get())

    ballScale.set(track.get_volume())
    s1=Scale(app,variable=ballScale,resolution=0.1,command=ScaleVolume,orient=HORIZONTAL,from_=0.0,to=1.0,label="volume")
    s1.pack()
这就是我使用的文件。。调用代码并运行它

from tkinter import *
import pygame.mixer
from last_function import*

app=Tk()
mixer=pygame.mixer
mixer.init()
new_gui(app,"49119_M_RED_HardBouncer.wav",mixer)


def close():
    mixer.stop()
    app.destroy()

app.protocol("WM_DELETE_WINDOW",close)
app.mainloop()
一切正常。。但我的问题是

1> 为什么我不能从上一个函数文件中删除tkinter import*中的
。。因为不管怎么说,它在文件的顶部,这是正确的。为什么会出现一个错误,说IntVar()未定义

2> 为什么我必须在函数中作为参数传递
混合器
?函数不能直接从调用它的文件顶部的import pygame.mixer继承它吗?
我想说的是。也使用了TKINTER组件,但我不将TKINTER作为参数传递。。是的!那为什么会有这个。。。选择性参数赋值

我真的很困惑

1> 为什么我不能离开特金特 从最后一个函数文件导入*。。 因为不管怎么说,上面都有 调用它的文件的名称 对,为什么我会说一个错误 未定义IntVar()

Python“导入”遵循与Python语言其余部分相同的范围规则。通过在第二个文件顶部的“导入”,不会使Tkinter命名空间可用于最后一个_function.py模块。Tkinter也需要进口到那里

2> 为什么我必须通过混音器 函数中的参数?能 函数不能直接从中继承它 导入pygame。混音器。它位于 调用它的文件?我的意思是 说是。有两个TKINTER组件 也在使用中,但我没有通过 TKINTER作为参数。。我知道!!然后 为什么会有这个。。选择性的 参数赋值

按照这种编码方式,您需要传递混合器,因为您正在使用以下命令在第二个文件中修改它:

mixer.init()
如果在上一个_function.py中重新导入mixer,则会得到mixer的另一个实例,而不是以前导入的实例。这没有什么选择性,因为您的两个文件都导入了Tkinter命名空间


您应该尝试重新考虑此代码,以避免必须将Tkinter导入两个模块,以及必须在一个模块中初始化混频器并将其传递给另一个模块。

请不要大喊大叫,即使您很困惑。这可能是一个循环导入错误,表明某个地方存在设计缺陷。一般来说,您应该避免从x导入
*
,除非您必须使用它。它会把你的名字空间弄得乱七八糟,并且会给内置程序加上阴影(
from os import*
shadows the build-in
open()
。例如,内置程序返回一个文件句柄,
os.open
返回一个int)。@g.d.d.c-这很有启发性,谢谢。。从现在起我将使用FQN@g、 d.d.c.这不属于答案吗?@truthreality-可能,尽管我还没有回答这个问题,只是做了一个假设。我需要花更多的时间来弄清楚它究竟在哪里/是否是一个循环导入错误。我只知道,当你只能通过从x import*
执行
来完成某项工作时,这通常就是问题所在。@Mark-我认为你之前的解释更好(虽然有点复杂),但是。。我得到了它!!谢谢