好像python是偏的

时间:2011-06-14 16:21:05

标签: 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:
            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>为什么我不能从last_function文件中删除from tkinter import* ..因为无论如何它都是在正确调用它的文件的顶部。为什么我会收到一个错误,说IntVar()没有定义。

2 - ;为什么我必须在函数中传递mixer作为参数?该函数是否可以直接从调用它的文件顶部的import pygame.mixer继承它?  我的意思是说。有TKINTER组件也被使用,但我不认为TKINTER作为参数..我!那为什么会有这个...选择性参数赋值??

我真的很困惑!

1 个答案:

答案 0 :(得分:2)

  

1>为什么我不能从tkinter中删除   从last_function文件导入* ..   因为无论如何它都在顶部   调用它的文件   对。为什么我会说错误   IntVar()未定义

Python“import”遵循与其他Python语言相同的作用域规则。通过第二个文件顶部的“import”不会使last_function.py模块可以使用Tkinter命名空间。 Tkinter也需要在那里进口。

  

2>为什么我必须通过调音台作为   函数中的参数?可以的   函数不直接从中继承   导入pygame.mixerthat是最重要的   调用它的文件?我的意思是什么   说是的。还有TKINTER组件   也被使用,但我不通过   TKINTER作为参数..我做!!然后   为什么会这样..有选择性   参数赋值??

使用此编码的方式,您需要通过混音器,因为您在第二个文件中修改它:

mixer.init()

如果你在last_function.py中重新导入了混音器,你将获得另一个混音器实例,而不是之前导入的混音器实例。由于您的两个文件都已导入Tkinter名称空间,因此没有任何选择性。

您应该尝试重新考虑此代码,以避免将Tkinter导入两个模块,并在一个模块中将init混合并传递给另一个模块。