如何使 MacOs Tkinter 按钮看起来像 Windows Tkinter 按钮

问题描述

我正在使用 tkinter 制作计算器。然而,每当我使用按钮时,我都会被 macOS 按钮的丑陋外观所困扰,我想让它们看起来像 Windows 上的按钮。我也无法更改背景颜色。我尝试使用 tkmacosx 更改背景颜色,但没有用。

我的预期输出

enter image description here

我的输出

enter image description here

我的代码

class FoodHuntingEnv(gym.Env):
    Metadata = {'render.modes': ['human','rgb_array']}

    GraviTY = -10.0
    BULLET_STEPS = 120 # p.settimestep(1.0 / 240.0),so 1 gym step == 0.5 sec.

    def __init__(self,render=False,robot_model=R2D2,max_steps=500,num_foods=3,num_fakes=0,object_size=1.0,object_radius_scale=1.0,object_radius_offset=1.0,object_angle_scale=1.0):
        """Initialize environment.
        """
        ### gym variables
        self.observation_space = robot_model.getobservationSpace() # classmethod
        self.action_space = robot_model.getActionSpace() # classmethod
        self.reward_range = (-1.0,1.0)
        self.seed()
        ### pybullet settings
        self.ifrender = render
        self.physicsClient = p.connect(p.GUI if self.ifrender else p.DIRECT)
        
      
        p.setAdditionalSearchPath(pybullet_data.getDataPath())
        ### env variables
        self.robot_model = robot_model
        self.max_steps = max_steps
        self.num_foods = num_foods
        self.num_fakes = num_fakes
        self.object_size = object_size
        self.object_radius_scale = object_radius_scale
        self.object_radius_offset = object_radius_offset
        self.object_angle_scale = object_angle_scale
        self.plane_id = None
        self.robot = None
        self.object_ids = []
        ### episode variables
        self.steps = 0
        self.episode_rewards = 0.0

    def close(self):
        """Close environment.
        """
        p.disconnect(self.physicsClient)
    
    
    def reset(self):
        """Reset environment.
        """
        self.steps = 0
        self.episode_rewards = 0
        p.resetSimulation()
        # p.settimestep(1.0 / 240.0)
        p.setGravity(0,self.GraviTY)
        self.plane_id = p.loadURDF('plane.urdf')
        self.robot = self.robot_model()
        self.object_ids = []
        for i,(pos,orn) in enumerate(self._generateObjectPositions(num=(self.num_foods+self.num_fakes),radius_scale=self.object_radius_scale,radius_offset=self.object_radius_offset,angle_scale=self.object_angle_scale)):
            if i < self.num_foods:
                urdfPath = 'food_sphere.urdf'
            else:
                urdfPath = 'food_cube.urdf'
            object_id = p.loadURDF(urdfPath,pos,orn,globalScaling=self.object_size)
            self.object_ids.append(object_id)
        for i in range(self.BULLET_STEPS):
            p.stepSimulation()
        obs = self._getobservation()
        #print('reset laile')
        #self.robot.printAllJointInfo()
        return obs

    def step(self,action):
        """Apply action to environment,then return observation and reward.
        """
        self.steps += 1
        self.robot.setAction(action)
        reward = -1.0 * float(self.num_foods) / float(self.max_steps) # so agent needs to eat foods quickly
        for i in range(self.BULLET_STEPS):
            p.stepSimulation()
            reward += self._getReward()
        self.episode_rewards += reward
        obs = self._getobservation()
        done = self._isDone()
        pos,orn = self.robot.getPositionAndOrientation()
        info = { 'steps': self.steps,'pos': pos,'orn': orn }
        if done:
            #print('Done laile')
            info['episode'] = { 'r': self.episode_rewards,'l': self.steps }
            # print(self.episode_rewards,self.steps)
        #print(self.robot.getBaseRollPosition(),self.robot.getTorsoLiftPosition(),self.robot.getHeadPosition(),self.robot.getArmPosition(),self.robot.getWristPosition(),self.robot.getgripperPosition()) # for HSR debug
        #print(self.robot.getHeadPosition(),self.robot.getgripperPosition()) # for R2D2 debug
        return obs,reward,done,info

    def render(self,mode='human',close=False):
        """This is a dummy function. This environment cannot control rendering timing.
        """
        if mode != 'rgb_array':
          return np.array([])
        return self._getobservation()
        

    def seed(self,seed=None):
        """Set random seed.
        """
        self.np_random,seed = seeding.np_random(seed)
        return [seed]

    def _getReward(self):
        """Detect contact points and return reward.
        """
        reward = 0
        contacted_object_ids = [ object_id for object_id in self.object_ids if self.robot.isContact(object_id) ]
        for object_id in contacted_object_ids:
            reward += 1 if self._isFood(object_id) else -1
            p.removeBody(object_id)
            self.object_ids.remove(object_id)
        return reward

    def _getobservation(self):
        """Get observation.
        """
        obs = self.robot.getobservation()
        return obs

    def _isFood(self,object_id):
        """Check if object_id is a food.
        """
        baseLink,urdfPath = p.getBodyInfo(object_id)
        return urdfPath == b'food_sphere.urdf' # otherwise,fake

    def _isDone(self):
        """Check if episode is done.
        """
        #print(self.object_ids,'self')
        available_object_ids = [ object_id for object_id in self.object_ids if self._isFood(object_id) ]
        #print(available_object_ids)
        return self.steps >= self.max_steps or len(available_object_ids) <= 0

    def _generateObjectPositions(self,num=1,retry=100,radius_scale=1.0,radius_offset=1.0,angle_scale=1.0,angle_offset=0.5*np.pi,z=1.5,near_distance=0.5):
        """Generate food positions randomly.
        """
        def genPos():
            r = radius_scale * self.np_random.rand() + radius_offset
            a = -np.pi * angle_scale + angle_offset
            b =  np.pi * angle_scale + angle_offset
            ang = (b - a) * self.np_random.rand() + a
            return np.array([r * np.sin(ang),r * np.cos(ang),z])
        def isNear(pos,poss):
            for p,o in poss:
                if np.linalg.norm(p - pos) < near_distance:
                    return True
            return False
        def genPosRetry(poss):
            for i in range(retry):
                pos = genPos()
                if not isNear(pos,poss):
                    return pos
            return genPos()
        poss = []
        for i in range(num):
            pos = genPosRetry(poss)
            orn = p.getQuaternionFromEuler([0.0,0.0,2.0*np.pi*self.np_random.rand()])
            poss.append((pos,orn))
        return poss

解决方法

macOS Big Sur (11.0.1)

因此,tkmacosx 必须完美运行。也许您导入了 tkmacosx,但继续使用 tkinter 按钮?

这是我的代码,它改变了背景、前景色。

"borderless=1" 移除按钮的边框。

"focuscolor=''" 在您按下按钮时移除蓝色边框。

buttonExit = tkmacosx.Button(mainWindow,text='✕',font=buttonFont,anchor='center',height=15,width=15,fg='#740000',bg='#ff5f56',activebackground='#be4741',activeforeground='#740000',borderless=1,focuscolor='',command=lambda: mainWindow.destroy())

buttonExit.place(x=0,y=0)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...